说不完美,是因为会出现些问题
1.有个别物体没到达目标点附近就停止了
2.当两次目标点距离较近时,物体可能部分会重叠
实现方法:
使用Nav Mesh Obstacle
在寻路过程中,关闭障碍组件,
寻路结束,关闭寻路组件,打开障碍组件。
建议不要在公司项目中使用,也期待有网友能分享其它更好解决方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
using UnityEngine; using System.Collections; using System.Collections.Generic; public class NewBehaviourScript : MonoBehaviour { public GameObject targetGo; public List<NavMeshAgent> agents; void Start() { StartCoroutine( IUpdate() ); } IEnumerator IUpdate() { while ( true ) { // 按下鼠标,开始寻路 if ( Input.GetMouseButtonDown( 0 ) ) { Ray ray = Camera.main.ScreenPointToRay( Input.mousePosition ); RaycastHit hitInfo; if ( Physics.Raycast( ray, out hitInfo ) ) { targetGo.transform.position = hitInfo.point + new Vector3(0, 0.5f, 0); for ( int i = 0; i < agents.Count; i++ ) { agents[i].GetComponent<NavMeshObstacle>().enabled = false; yield return null; // 这里必须要等待一帧,否则 下一次寻路就会错位。 agents[i].enabled = true; agents[i].SetDestination( hitInfo.point ); } } } yield return null; // 动态设置优先级 if ( agents[0].enabled ) { agents.Sort( ( x, y ) => { if ( x.enabled && y.enabled ) { return x.remainingDistance.CompareTo( y.remainingDistance ); } return 0; } ); for ( int i = 0; i < agents.Count; i++ ) { agents[i].avoidancePriority = 50 + i; } } // 判断到达结束点 打开障碍组件 for ( int i = 0; i < agents.Count; i++ ) { if ( agents[i].enabled && agents[i].remainingDistance > 0.5f && agents[i].remainingDistance < 0.8f ) { agents[i].Stop(); agents[i].enabled = false; agents[i].GetComponent<NavMeshObstacle>().enabled = true; } } } } } |
项目使用版本:Unity5.3.6 GitHub下载地址:
https://github.com/654306663/NavMeshAgent
- 本文固定链接: http://www.u3d8.com/?p=1093
- 转载请注明: 网虫虫 在 u3d8.com 发表过