Navmeshagent与飞行(2)

昨天发布了Naveshagent与飞行,有朋友说关键是差值,所以今天就将差值也加了进去。昨天的版本墙太高的话(大于了角色飞行高度),角色就会飞不过去,而穿进了墙中。

今天修改后的效果看图:


先说一下实现的原理:就是在飞行角色的下面加两个子Point,一直发射射线来作为角色的眼睛。


下面是控制角色的代码:

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 hit;
            Vector3 direct = transform.GetChild
(0).position - transform.GetChild(1).position;
            if (Physics.Raycast(transform.GetChild
(1).position, direct, out hit))
            {
           
                    Vector3 newpos = new Vector3
(transform.position.x, hit.point.y + _Height, 
transform.position.z);
                    transform.position = Vector3.MoveTowards(transform.position, newpos, Time.deltaTime * 40); //这里加入了差值
              
            }
            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;
                }
                      
                   
            }


        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值