【Unity 30】 Unity中的 NavMesh和简单塔防

PS:本系列笔记将会记录我此次在北京学习Unity开发的总体过程,方便后期写总结,笔记为日更。
笔记内容均为 自己理解,不保证每个都对

咕咕咕了好几天, 一直咕,一直爽

Part 1 NavMest:

在这里插入图片描述
使用方法:
1,设置代理 。 NavMeshAgent
2,设置路径 并且 navi static .
3,Bake.
4,设置终点。

在这里插入图片描述

Bake结果:
在这里插入图片描述

蓝色部分 为可以自动寻路部分。,黑色为可以跳跃的地方。

代码部分:实现鼠标点击自动寻路功能

public class NaviTest : MonoBehaviour
{
    NavMeshAgent myAgent;
    // Start is called before the first frame update
    void Start()
    {
        //获得 NavMeshAgent 组件
        myAgent = gameObject.GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))    //检测鼠标按下
        {
            Ray tmpRay = Camera.main.ScreenPointToRay(Input.mousePosition);

            RaycastHit tmpHit;

            if(Physics.Raycast(tmpRay, out tmpHit, 100))
            {
                myAgent.SetDestination(tmpHit.point);
            }
        }

Part 2 简单塔防:

实现功能:
1、怪物自动生成
2、怪物自动寻路
3、区分选中与非选中建筑
4、炮塔射击,默认攻击距离当前炮塔最近的怪物
5、击中怪,怪掉血,0血死亡

在这里插入图片描述

怪物生成 就是利用 实例化方法:

        Object tmpObj = Resources.Load("MidMonster");
        GameObject tmpGameObj = GameObject.Instantiate(tmpObj) as GameObject;
        tmpGameObj.transform.SetParent(tmpParent, false);

自动寻路利用 Part 1 的知识:

    void Start()        //怪物移动
    {
        target = GameObject.Find("End").transform;
        myAgent = gameObject.GetComponent<NavMeshAgent>();
        myAgent.SetDestination(target.transform.position);      //移动目标 End.position
    }

区分选中与未选中建筑 利用 射线击中方法:

    Transform frontHit;     //记录上一个选中的塔
    // Update is called once per frame
    void Update()
    {
        Ray tmpRay = Camera.main.ScreenPointToRay(Input.mousePosition);

        RaycastHit tmpHit;      //记录击中信息

        if (Input.GetMouseButtonDown(1))
        {
            if (frontHit != null)
            {
                frontHit.GetComponent<Renderer>().material.color = Color.white;     //上一个击中塔 恢复颜色
            }
            frontHit = null;
        }

        if (Input.GetMouseButtonDown(0))
        {
            if(Physics.Raycast(tmpRay, out tmpHit, 100))        //判断是否击中
            {
                if(tmpHit.transform.tag == "Tower")     //判断击中物体是否为  Tower
                {
                    if (frontHit != null)       //上一个击中塔恢复颜色
                    {
                        frontHit.GetComponent<Renderer>().material.color = Color.white;
                    }

                    tmpHit.transform.GetComponent<Renderer>().material.color = Color.red;       //当前击中塔 记为红色
                    frontHit = tmpHit.transform;        //记录当前塔


                    Object tmpObj = Resources.Load("MyTower");
                    GameObject tmpGameObj = GameObject.Instantiate(tmpObj) as GameObject;
                    tmpGameObj.transform.position = tmpHit.point;


                }
            }
        }
    }

攻击距离最近怪物:
怪物管理器脚本:

    public GameObject FindCloest(Transform tower)       //找到距离炮塔最近的怪
    {
        float Min = 100000;
        int index = -1;
        
        for (int i = 0; i < monsterList.Count; i++)
        {
            float tmpDis = Vector3.Distance(tower.transform.position, monsterList[i].transform.position);

            if(Min > tmpDis)
            {
                Min = tmpDis;
                index = i;
            }
        }

        if (index != -1)
        {
            return monsterList[index];
        }
        else
            return null;
    }

炮塔脚本:

    void ShowOrHide()       //火花显示
    {
        if (fire.activeSelf)
        {
            fire.SetActive(false);
        }
        else
        {
            GameObject tmpObj = MonsterManageTest.Instance.FindCloest(transform);
            
            if(tmpObj != null)
            {
                float tmpDis = Vector3.Distance(transform.position, tmpObj.transform.position);
                Debug.Log("tmpDis == " + tmpDis);

                if (tmpDis < 20)
                {
                    target = tmpObj.transform;
                    GenBullet();
                }
                fire.SetActive(true);
            }
        }
    }

怪死亡 利用 MVC 思路

    public class MonsterM
    {
        public float Blood = 100;
        public float getBlood()
        {
            return Blood;
        }
    }


    Animator myAnimator;
    MonsterM monster;

    // Start is called before the first frame update
    void Start()
    {
        monster = new MonsterM();
        myAnimator = gameObject.GetComponent<Animator>();
        myAnimator.SetBool("Dead", false);
    }

    private void OnTriggerEnter(Collider other)
    {
        monster.Blood -= 10;
        Debug.Log("monster.bloodCount == " + monster.Blood);
        if (monster.getBlood() <= 0)
        {
            GameObject.Destroy(gameObject);
        }
    }

    private void OnDestroy()
    {
        myAnimator.SetBool("Dead", true);
        MonsterManageTest.Instance.Remove(gameObject);
    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值