开发环境: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、预览效果

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

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

  1. 【Unity】4.1 创建组件

    分类:Unity.C#.VS2015 创建日期:2016-04-05 一.简介 组件(Component)在Unity游戏开发工作中非常重要,可以说是实现一切功能所必需的. 1.游戏对象(Game O ...

  2. Unity Jobsystem 详解实体组件系统ECS

    原文摘选自Unity Jobsystem 详解实体组件系统ECS 简介 随着ECS的加入,Unity基本上改变了软件开发方面的大部分方法.ECS的加入预示着OOP方法的结束.随着实体组件系统ECS的到 ...

  3. 关于 Unity UGUI 中修改 Mask 组件下 Image 等子节点组件的材质无效的问题

    前几天同事做了一个效果,希望在原本使用了遮罩组件 Mask 的技能图标(让技能图标变成圆形)上在添加一个置灰的功能,但问题来了:因为是动态根据游戏中玩家的条件才动态置灰,以修改 Mask 下子节点 I ...

  4. Unity UGUI Layout自动排版组件用法介绍

    Unity UGUI布局组件 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享 ...

  5. 使用Unity中的Box Collider组件完成游戏场景中的碰撞检测功能

    一.介绍 目的:通过Unity自带的组件完成游戏场景中的碰撞检测功能. 软件环境:Unity 2017.3.0f3 二.实现过程 1,在面板中点击Add Component按钮 2,添加Box Col ...

  6. android开发之路12(android四大组件&Fragment&AsyncTask类)

    一.Activity组件1.简介:Activity组件是Android四大组件之一,通常一个Activity相当于一个用户界面,我们可以通过加载布局文件将Android提供的各种控件及自定义控件显示到 ...

  7. Unity扩展 自定义事件Send组件

    在写项目的时候,我创建了一个方法里面需要一个int的参数.  我记得是UIEvent Trigger 不能直接传递一个数字,最多只能传递一个GameObject属性过去(=.=那个值不想再组件上定义) ...

  8. unity中的UGUI一些组件的使用

    一.Toggle Group(Script) LeftButtons上添加Toggle Group组件,属性Allow Switch Off打对勾,代表它的所有子物体上带有Toggle组件的属性Is ...

  9. 关于Unity中的帧动画组件的编写

    一.帧动画 1: 美术准备好一个连续动作的离散图片;2: 程序在准确的时间来切换这个图片;3: 优点: 简单,速度快; 缺点:资源占用相对过大; 二.frame_anim组件编写 1: 代码里面强制要 ...

随机推荐

  1. c语言二叉树

    Department of Computing and Information SystemsCOMP10002 Foundations of AlgorithmsSemester 2, 2014As ...

  2. MYSQL校对规则

    一.前言 有时候遇到这种情况,你用一个like语句查询,查到的结果中有一些并没有包含你查询的关键词的纪录:有时候遇到这种情况,你的数据库自作聪明的大小写不敏感,让你在更新时把大小写不同的两条记录都更新 ...

  3. 简单配置nginx使之支持pathinfo

    只需要修改3个地方就可以了 location ~ \.php {    #去掉$ root          H:/PHPServer/WWW; fastcgi_pass   127.0.0.1:90 ...

  4. MySql批量更新方法

    准备数据 表 user(用户).dept(部门) 1:更新符合单个条件的某个字段的一条数据 update user u set u.name = '测试' where u.id = "&qu ...

  5. SQLServer创建维护计划失败 错误c001f011

    重新注册dts.dll文件,在运行里输入命令:(x64)regsvr32 "C:\Program Files\Microsoft SQL Server\100\DTS\Binn\dts.dl ...

  6. openlayers 注册事件例子

    registerEvents:function() { this.events = new OpenLayers.Events(this, this.div, null, true); functio ...

  7. FAILURE: Build failed with an exception.

    FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:installD ...

  8. oracle 查询月份差

    select to_char(add_months(trunc(sysdate),-1),'yyyymm') from dual;

  9. Frogger(floyd变形)

    Frogger Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  10. oracle 12541,12560,00511无监听程序, 协议适配器错误问题分析及解决方案

    oracle 12541,12560,00511无监听程序, 协议适配器错误问题分析及解决方案   问题描述: 1. lsnrctl start.stop.非常慢,出现卡顿现象: 2. 执行lsnrc ...