【Unity】12.5 Navmesh Obstacle组件

开发环境:Win10、Unity5.3.4、C#、VS2015

创建日期:2016-05-09

一、简介

在大多数游戏情景中,可行进的区域往往不是完全不变的。比如被破坏的路、桥等将不再允许通过。那么,如何控制行进物体呢?有两种解决办法。

第一种解决办法是分层控制,然后动态更改可行进层,比如对于不同的桥,分别用不同的层来控制。但是这种处理有一个局限性,比如一个游戏场景中包含很多桥的情形,每个桥都有自己的通行或禁止状态,那么如果分层控制,那么就需要为每一个桥分一个层,这样—来层数肯定不够用,因为在Unity中最多只能分32层。其次,在行进物体很多的时候,频繁改动进行物体的可行进层也不是—件轻松的事情。

第二种解决办法是利用Navmesh Obstade组件处理类似动态路障的问题。只要将该组件挂载到动态路障上,行进物体将会在寻路时自动躲避这些路障。

二、示例

该例子主要介绍第二种办法的具体实现。即:利用Navmesh Obstade组件处理类似动态路障的问题。采用这种办法时,不需要手动改变行进物体的可行进层,只需要在桥体上挂载Navmesh Obstade组件,然后通过脚本改变Navmesh Obstade组件的enable的值即可。在桥对象可通行时,enable的值为false,桥面不可通行时enable的值为true。

1、创建场景

在ch1201_Navmesh_Sample工程中,新建一个名为Demo4的场景,在场景中分别添加下面的对象:

其中,Demo4Mask下的Cube都是静态的,player是行进对象,greenCube是目的地。

2、烘培

具体步骤和前面的节类似,烘培后的结果如下:

3、为bridge添加Nav Mesh Obstable组件

在层次视图中选中bridge,为其添加【Nav Mesh Obstable】组件:

添加后,可看到bridge会被一个绿色的网格包围。

4、编写脚本

添加一个名为Demo4BridgeControl.cs的脚本,将其改为下面的内容:

using UnityEngine;
using System.Collections;

public class Demo4BridgeControl : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Init());
    }

    IEnumerator Init()
    {
        GetComponent<Renderer>().enabled = false;
        yield return new WaitForSeconds(2.0f);
        GetComponent<NavMeshObstacle>().enabled = false;
        GetComponent<Renderer>().enabled = true;
    }

    void Update() {  }
}

代码中用了yield return来代替计时,这种方式比直接用一个time变量控制计时方便,代码也显得更简洁。

5、将脚本添加到bridge

将脚本拖放到bridge对象上。

6、预览效果

按【播放】按钮预览游戏,就会发现行进的胶囊体会一直等待桥面出现后,才通过桥到达目的地。

时间: 2024-11-02 20:20:34

【Unity】12.5 Navmesh Obstacle组件的相关文章

【Unity】4.1 创建组件

分类:Unity.C#.VS2015 创建日期:2016-04-05 一.简介 组件(Component)在Unity游戏开发工作中非常重要,可以说是实现一切功能所必需的. 1.游戏对象(Game Object) 游戏对象(Game Object)包括空物体.基本几何体.外部导入的模型.摄像机.GUI.粒子.灯光.树木等各类元素. 凡是出现在层次视图中的元素都是游戏对象. 2.组件(Component) 组件是在游戏对象(Game Object)中的实现某些功能的集合.无论是模型.GUI.灯光还

12.Android之Tabhost组件学习

TabHost是整个Tab的容器,TabHost的实现有两种方式: 第一种继承TabActivity,从TabActivity中用getTabHost()方法获取TabHost.各个Tab中的内容在布局文件中定义就行了. 第二种方式,不继承TabActivity,在布局文件中定义TabHost即可,但是TabWidget的id必须是@android:id/tabs,FrameLayout的id必须是@android:id/tabcontent. 1)继承TabActivity 如果加载该TabH

Unity扩展 自定义事件Send组件

在写项目的时候,我创建了一个方法里面需要一个int的参数.  我记得是UIEvent Trigger 不能直接传递一个数字,最多只能传递一个GameObject属性过去(=.=那个值不想再组件上定义) UIButton Message组件不能传递参数. UIEvent Trigger组件 传递GameObject某个组件的属性过去 感觉这两个都不是很合适就自己写了一个SendMessage组件 如图: 组件类: using UnityEngine; using System.Collection

Kubernetes - - k8s - v1.12.3 prometheus traefik组件安装及集群测试

1,traefik traefik:HTTP层路由,官网:http://traefik.cn/,文档:https://docs.traefik.io/user-guide/kubernetes/ 功能和nginx ingress类似. 相对于nginx ingress,traefix能够实时跟Kubernetes API 交互,感知后端 Service.Pod 变化,自动更新配置并热重载.Traefik 更快速更方便,同时支持更多的特性,使反向代理.负载均衡更直接更高效. k8s集群部署Trae

Unity手游之路&lt;九&gt;自动寻路Navmesh之高级主题

http://blog.csdn.net/janeky/article/details/17492531 之前我们一起学习了如何使用Navmesh组件来实现最基本的角色自动寻路.今天我们再继续深入探索Navigation组件的高级功能.在本文中,你将了解到如何在两个隔离层自动生成寻路网格?如何手动指定寻路网格的路线?以及寻路网格层的应用.(本文所用到的模型皆来自Unity3d官网). (转载请注明原文地址http://blog.csdn.net/janeky/article/details/17

自动寻路Navmesh高级(寻路网格)

之前我们一起学习了如何使用Navmesh组件来实现最基本的角色自动寻路.今天我们再继续深入探索Navigation组件的高级功能.在本文中,你将了解到如何在两个隔离层自动生成寻路网格?如何手动指定寻路网格的路线?以及寻路网格层的应用. ?   隔离层自动生成寻路网格 ?               (源码scene1.unity) ?               1.创建Plane实例P1,P2,两者之间出现一条鸿沟.直接控制角色位移是无法通过的. ?               2.打开Nav

unity 2种实现动态障碍方法

此文将介绍2种实现动态障碍的方法,一种基于navmesh,一种基于astar算法. 1.基于navmesh. 1.制作场景障碍: a.有几个独立的障碍物,就定义几个user area,即,一个场景仅仅支持一个字节数目的独立障碍物 b.建立碰撞盒建立障碍物: 碰撞盒是可行走区域. c.设置碰撞盒gameobject的navigation面板的object页签的navigation area属性: 每个独立障碍物对应一个前面步骤a中定义的area,如果几个障碍一起动态生成或消失,则可以使用同一个ar

Unity多单位战斗寻路问题的一种解决办法

Unity多单位战斗寻路问题的一种解决办法 Unity提供了NavMesh 导航组件 ? NavMesh是在实践中通用性最好的一种导航方式,但是Unity的实现并没有完全提供一个开放自由的API. 主要的麻烦是: 1.不能脱离Editor生成NavMesh. 2.NavMesh信息保存在场景中,必须随场景加载. ? 他的使用方式主要是在Editor阶段设定障碍关系. NavMeshAgent 作为移动单位来寻路 NavMeshObstacle 作为动态障碍 NavMeshAgent和NavMes

导航网格寻路

静态烘培 添加NavMeshAgent组件 让角色添加脚本控制 public Transform TraGoals;                             //寻路目标 private NavMeshAgent _Agent;                           //寻路代理 void Start () { //得到寻路代理 _Agent = this.gameObject.GetComponent<NavMeshAgent>(); }//Start_end