using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; using UnityEngine.EventSystems; [RequireComponent(typeof(NavMeshAgent))] public class NavController : BaseController { /// /// 单击时显示的光圈对象 /// [Tooltip("单击时显示的光圈对象")] public GameObject preClick; /// /// 可点击的地面层 /// [Tooltip("地面所在的层,需要将地面对象的层设为此")] public LayerMask layer; /// /// 角色寻路旋转速度 /// [Tooltip("角色寻路旋转速度")] public float rotateSpeed = 50f; /// /// 角色寻路移动速度 /// [Tooltip("角色寻路移动速度")] public float moveSpeed = 2f; /// /// 角色寻路最远距离 /// [Tooltip("角色寻路最远距离")] public float MaxNavDistance = 10f; /// /// 导航代理对象 /// NavMeshAgent agent; GameObject objClick; void Start() { agent = GetComponent(); if (agent != null) { // 初始化移动和旋转速度 agent.speed = moveSpeed; agent.angularSpeed = rotateSpeed; } if(transform.parent != null) objClick = Instantiate(preClick, transform.parent.transform); else objClick = Instantiate(preClick); objClick.SetActive(false); layerMask = (1 << 0) | (1 << 6); // 地面跟默认层(墙) } // 射线检测 RaycastHit hit; Ray ray; int layerMask; NavMeshHit meshHit; Vector3 mouseDownPos; void LateUpdate() { if (CanControl && agent.enabled && !IsTouchOnControl && !IsJoyStickOnControl && !IsUIClicked) { if (Input.GetMouseButtonUp(1) || Input.touchCount == 1) { if (!EventSystem.current.IsPointerOverGameObject()) { if (!IsMouseOnControl && Input.touchCount == 1) { ray = CommonData.MainCamera.ScreenPointToRay(Input.touches[0].position); } else { ray = CommonData.MainCamera.ScreenPointToRay(Input.mousePosition); } if (Physics.Raycast(ray, out hit, MaxNavDistance, layerMask)) { // Debug.Log(hit.collider.name); // 判断点击的对象所在层与所设置的层是否一致 if (Mathf.Pow(2, hit.collider.gameObject.layer) == layer.value) { if (NavMesh.SamplePosition(hit.point, out meshHit, 1.0f, NavMesh.AllAreas)) { // agent.enabled = true; // 设置提示对象位置并显示 objClick.transform.position = hit.point; objClick.SetActive(true); // 自动寻路到目标位置 agent.isStopped = false; agent.SetDestination(hit.point); // 标识自动寻路控制中 IsNavOnControl = true; } } } } } } // 如果控下键盘或鼠标则停止寻路 // if (IsMouseOnControl || IsKeyOnControl || IsJoyStickOnControl) if (IsKeyOnControl || IsJoyStickOnControl) { StopNav(); } if (IsNavOnControl && !IsMoving()) { IsNavOnControl = false; } } /// /// 停止寻路 /// public void StopNav() { if (agent.enabled) { agent.isStopped = true; // 停止自动寻路 } objClick.SetActive(false); // 隐藏点击图标对象 IsNavOnControl = false; // agent.enabled = false; } // Unity导航是否到达目的地的方法,(包括有些不可能到达的目的地) public bool IsMoving() { if (!agent.enabled) return false; //bool r = agent.pathPending || agent.remainingDistance > agent.stoppingDistance || agent.velocity != Vector3.zero; //r = agent.enabled ? r : false; //return r; return agent.enabled ? agent.pathPending || agent.remainingDistance > agent.stoppingDistance || agent.velocity != Vector3.zero : false; } }