NavMesh动态碰撞

今天遇到一个问题,就是怎样处理一些动态的障碍物。

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

能够看一下。效果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodW96aGlsaW5nMDEwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

參数设置

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlodW96aGlsaW5nMDEwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

时间: 2024-12-08 11:50:43

NavMesh动态碰撞的相关文章

NavMesh系统动态碰撞的探讨

Unity3D提供的NavMesh系统可以方便的解决游戏的寻路问题,但是该系统有一个比较让人不理解的问题: NavMesh导航时会忽略Physics系统本身的碰撞,也就是说NavMeshAgent在移动的过程中不会被Collider阻挡,而是会直接走过去(但是OnTriggerEnter等触发功能正常). 动态碰撞的功能对很多游戏都是一个基本的需求,而根据NavMesh提供的接口,唯一可以实现阻挡功能的只有NavMeshObstacle,而NavMeshObstacle只有一种形状:圆柱体,而且

Unity3D之碰撞体,刚体

一 概念介绍 刚体 Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力用来保证游戏对象像在真实世界中那样进行运动.任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过NVIDIA物理引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件. 碰撞体 碰撞体是物理组件的一类,它要与刚体一起添加到游戏对象上才能触发碰撞.如果两个刚体相互撞在一起,除非两个对象有碰撞体时物理引擎才会计算碰撞,在物理模拟中,没有碰撞体的刚体

浅谈Unity-Rigidbody碰撞穿透

首先,说说碰撞的条件:1.rigidbody(刚体),一般用在主动移动的物体上,比如角色.2.collider,碰撞器,一般用于受力物体上,比如障碍块. 物理的碰撞当然是基于物理检测计算,而这个计算是消耗cpu和gpu的,那么,碰撞穿透是什么鬼? 发生概率即触发方式: 1.刚体速度足够快,被撞物体的collider足够薄. 2.刚体速度在一定的v,被撞物体也在一定的速度v(被撞物体可移动). 3.暂时未发现的其他情况. 在分析这两种(3种)情况之前,先了解下一个刚体(rigidbody)属性参数

Unity-Rigidbody碰撞穿透

首先,说说碰撞的条件:1.rigidbody(刚体),一般用在主动移动的物体上,比如角色.2.collider,碰撞器,一般用于受力物体上,比如障碍块. 发生概率即触发方式: 1.刚体速度足够快,被撞物体的collider足够薄. 2.刚体速度在一定的v,被撞物体也在一定的速度v(被撞物体可移动). 3.暂时未发现的其他情况. 在分析这两种(3种)情况之前,先了解下一个刚体(rigidbody)属性参数:Collision Detection(碰撞检测): 它有三种选项:Discrete(离散)

Unity常见面试题大全

1.       [C#语言基础]请简述拆箱和装箱. 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何接口类型的过程. 1.在堆中开辟内存空间. 2.将值类型的数据复制到堆中. 3.返回堆中新分配对象的地址. 拆箱操作: object类型显示转换为值类型或从接口类型到实现该接口值类型的过程. 1.判断给定类型是否是装箱时的类型. 2.返回已装箱实例中属于原值类型字段的地址. 2.        [.NET(C#)] attribute,property,markup,ta

(转载)虚幻引擎3--基础知识

这是虚幻引擎3UDN的技术文档,共有六个章节.以下将分别把中文译本贴出来,方便懒人学习[偷笑]  一.虚幻引擎 3 基础知识 概述 -------------------------------------------------------------------- 有几个游戏性元素实际上是所有使用虚幻引擎3或虚幻开发工具包创建的项目所共有的.自定义这些元素可以创建出完全独特的.外观和行为符合期望的游戏.没有任何两个项目是相同的,尽管虚幻引擎提供了这些元素的默认实现,但是肯定需要对它们进行很大

【Unity】11.2 刚体(Rigidbody)

分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可接受外力与扭矩力,使游戏对象像在真实世界中那样进行运动. 任何游戏对象,只有对其添加了刚体组件,该对象才能受重力的影响. 通过脚本为游戏对象添加的作用力,以及通过NVIDlA物理引擎与其他的游戏对象发生互动的运算,都需要为游戏对象添加刚体组件. 二.如何为对象添加刚体 在Unity 5.x中为某个游戏对象添加刚体组件的办法是:选中要添加刚体的游

手游开发攻防——二、基础篇(持续更新)

不好意思,最近公司成员扩招,然后技术培训,项目事宜原因,因此这篇文章等到现在才出. 好了,不多说其它. 文章适合人群:对Unity基础组件有一些了解的,想知道怎么在项目中具体应用各种组件. 这篇文章以一个Asset Store上面的例子"Unity Projects Stealth"来讲解Unity的一些知识.所以可能你要对Unity一些概念有个了解.另外,这个例子"Unity Projects Stealth.unitypackage"我已经分享到http://p

Unity 的一些优化总结 (难度3 推荐4)

原文地址: http://www.jianshu.com/p/3acee1101fe4 从别的地方看到一些资源使用方面的文章,从中抽取一些细节在这里总结一下: Draw Call数量.Triangle数量 和 可见蒙皮网格数量 一般来说,Draw Call 数量.Triangle 数量 和 可见蒙皮网格数量 的推荐值需根据平台的不同而不同.对于 Mobile 低端移动设备来说,建议 Draw Call 数量的主要范围在 [0,200] 区间内,Triangle 数量保持在 10万 以下,可见蒙皮