今天遇到一个问题,就是怎样处理一些动态的障碍物。
NavMesh是能够躲避静态的障碍物。NavMeshObstacle的作用就是动态添加障碍。
可是有个问题,NavMeshObstacle是圆,连椭圆都不行,所以。仅仅好写一个附属脚本。用圆拼成矩形,就能够了。
using UnityEngine; using System.Collections; public class NavMeshObstacleHelper : MonoBehaviour { //coordinate public float X = 0f; public float Y = 0f; public float Z = 0f; public float Length = 0f; public float Width = 0f; public float Height = 0f; public float Diameter = 0f; private int lengthCount = 0; private float lengthStep = 0f; private int widthCount = 0; private float widthStep = 0f; private GameObject obstacleArray = null; private GameObject obstacle = null; void Awake() { obstacleArray = new GameObject (); obstacleArray.name = "NavMeshObstacleArray"; widthCount = (int)(Width / Diameter); lengthCount = (int) (Length / Diameter); if (lengthCount > 1) { lengthStep = (Length - Diameter * lengthCount) / (lengthCount - 1); } if (widthCount > 1) { widthStep = (Width - Diameter * widthCount) / (widthCount - 1); } } // Use this for initialization void Start () { initObstacleArray (); } private void initObstacleArray() { Vector3 tempPos = new Vector3 (X, Y, Z); for (int i = 0; i < lengthCount; i++) { for (int j = 0; j < widthCount; j++) { obstacle = new GameObject (); obstacle.transform.position = tempPos; obstacle.transform.parent = obstacleArray.transform; obstacle.AddComponent <NavMeshObstacle>(); NavMeshObstacle navMeshObstacle = obstacle.GetComponent<NavMeshObstacle> (); if (navMeshObstacle) { obstacle.GetComponent<NavMeshObstacle> ().radius = Diameter / 2; obstacle.GetComponent<NavMeshObstacle> ().height = Height; } tempPos = new Vector3 (tempPos.x, tempPos.y, tempPos.z + Diameter + widthStep); } tempPos = new Vector3 (tempPos.x + Diameter + lengthStep, tempPos.y, Z); } obstacleArray.transform.parent = this.transform; obstacleArray.transform.localRotation = Quaternion.identity; obstacleArray.transform.position = this.transform.position; } // Update is called once per frame void Update () { } }
思路来源自http://www.cnblogs.com/sifenkesi/p/4004215.html
能够看一下。效果:
參数设置