Navmeshagent与飞行(3)

来源:互联网 发布:淘宝客服面试注意事项 编辑:程序博客网 时间:2024/06/05 19:39

第2的版本上坡的时候没有问题,但下坡的时候就会提前下坡,出现下图的问题:


为了解决这个问题,我们需要从角色自身向下再发射一组射线,用前面的射线和向下发射的射线长度对比来判断是上坡还是下坡。
解决后的效果如下:



修改后的代码如下:

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.AI;public enum MoveType{    Walk,    Fly}public class Player : MonoBehaviour {    public MoveType _MoveType;    public float _Height;    private NavMeshAgent agent;    private Vector3 desPos;    private bool flyBool = false;    void Start () {        agent = transform.GetComponent<NavMeshAgent>();        if (_MoveType == MoveType.Fly) agent.enabled = false;    }void Update () {        if (Input.GetMouseButtonDown(0))        {            Move();        }        if (_MoveType == MoveType.Fly)        {            RaycastHit hit1;            Vector3 direct = transform.GetChild(0).position - transform.GetChild(1).position;            if (Physics.Raycast(transform.GetChild(1).position, direct, out hit1))            {                RaycastHit hit2;                if (Physics.Raycast(transform.position, -transform.up, out hit2))                {                    if (hit1.collider.tag != "Player" && hit2.collider.tag != "Player")                    {                        if (Vector3.Distance(transform.position, hit1.point) > Vector3.Distance(transform.position, hit2.point))                        {                            //表示从高的地方走向了低的地方                            Vector3 newpos = new Vector3(transform.position.x, hit2.point.y + _Height, transform.position.z);                            transform.position = Vector3.MoveTowards(transform.position, newpos, Time.deltaTime * 20);                        }                        else                        {                            Vector3 newpos = new Vector3(transform.position.x, hit1.point.y + _Height, transform.position.z);                            transform.position = Vector3.MoveTowards(transform.position, newpos, Time.deltaTime * 20);                        }                    }                 }                                                          }            if (flyBool)            {                transform.position = Vector3.MoveTowards(transform.position, desPos, Time.deltaTime *5);                if (Vector3.Distance(transform.position, desPos) < _Height + 0.1f)                {                    flyBool = false;                }            }        }    }    void Move()    {        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//在鼠标所在的屏幕位置发出一条射线        RaycastHit hit;        if (Physics.Raycast(ray.origin, ray.direction, out hit))        {            if (hit.collider.gameObject.tag == "Terrain")            {//设置地形Tag为Terrain                  switch (_MoveType)                {                    case MoveType.Walk:                        agent.SetDestination(hit.point);                        break;                    case MoveType.Fly:                        transform.LookAt(new Vector3(hit.point.x, transform.position.y, hit.point.z));                        desPos = hit.point;                        flyBool = true;                        break;                }                                                     }        }    }}


原创粉丝点击