利用导航网格限制玩家移动范围

在看插件案例时,发现了一个利用NavMeshAgent组件来限制玩家移动范围的用法。感觉挺有意思的,就先记录下来。

1.原理

其实挺简单的,就是agent在移动到边缘时,因为无法再向前了,NavMeshAgent中的Speed就会自动为零,于是把这个变量乘到实际的移动里就可以了。

2实现

具体代码如下:

using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]
public class MoveByNavi : MonoBehaviour
{
    private NavMeshAgent _agent;
    private Vector3 _moveDir;
    /// <summary>
    /// 移动方向(世界坐标)
    /// </summary>
    public Vector3 MoveDir
    {
        get { return _moveDir; }
        set { _moveDir = value.normalized; Move(_moveDir); }
    }
    /// <summary>
    /// 判断是否在移动
    /// </summary>
    public bool IsMove 
    {
        get { return _agent.velocity != Vector3.zero; }
    }

    [HideInInspector]
    public float Speed;
    private void Awake()
    {
        _agent = GetComponent<NavMeshAgent>();
        _agent.speed = 1;
    }

    private void Move(Vector3 movDir)
    {
        transform.Translate(movDir * _agent.speed * Speed);
    }

    #region TestInput
    /// <summary>
    /// just for test
    /// </summary>
    public float SpeedVal;
    private void Update()
    {
        Vector3 mov = InputDirViewToWorld(Camera.main.transform);
        if (mov != Vector3.zero)
        {
            Speed = SpeedVal * Time.deltaTime;
            MoveDir = mov;
        }
    }

    /// <summary>
    /// 将用户输入方向从摄像机空间转换到世界空间
    /// </summary>
    /// <param name="Cam">摄像机的Transform</param>
    /// <returns>返回世界空间下的方向</returns>
    public Vector3 InputDirViewToWorld(Transform Cam)
    {
        Vector3 tempMov = Vector3.zero;
        float horInput = Input.GetAxisRaw("Horizontal");
        float vertInput = Input.GetAxisRaw("Vertical");
        if (horInput != 0 || vertInput != 0)
        {
            tempMov.x = horInput;
            tempMov.z = vertInput;
            tempMov = Vector3.ClampMagnitude(tempMov, 1);
            Quaternion temp = Cam.rotation;
            Cam.eulerAngles = new Vector3(0, Cam.eulerAngles.y, 0);
            tempMov = Cam.TransformDirection(tempMov);
            Cam.rotation = temp;
        }
        return tempMov;
    }
    #endregion
}

后面的输入代码只是测试方便用,最主要的函数就是其中的move。

效果

在这里插入图片描述

适用范围

1.有靠NaviAgent移动的NPC,且玩家和NPC的移动范围一致。
2.简单场景快速实现限制移动范围。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值