Unity行为树
2015-11-06 20:22
423 查看
1、导入包Behavior Designer 1.5.0.1和Behavior Designer-Movement Pack 1.4.1b
2、编写两个类:一是:条件任务类,二是:行为任务类
tips:引入Behavior.Runtime和Behavior.Runtime.Tasks库。
(1)条件任务类:继承Conditional类
(2)行为任务类:继承Action类
例子:遍历场景内的敌人,是否在视野以内,是则移动,否则不作任何操作。
条件类:
[TaskCategory("Demo")]//特性往编辑器上添加目录,方便查询
public class EnemyInSight : Conditional
{
//目标Trans
public SharedTransform targetTrans;
//场景内的所有敌人
private GameObject[] targetList;
//目标标签
public string targetTag;
//可视角度
public float angle;
public override void OnAwake()
{
targetList=GameObject.FindGameObjectsWithTag(targetTag);
}
public override Taskstatus OnUpdate()
{
for(int i=0;i<targetList.length;++i)
{
if(IsInSight(targetList[i],angle))
{
targetTrans.Value=targetList[i];
return Taskstatus.Success;
}
}
return Taskstatus.Failure;
}
private bool IsInSight(Transform target,float angle)
{
Vector3 direciton=target.position-transform.position;
if(Vector3.Dot(transform.forward,direciton)<angle)
{ return true; }
}
}
行为类:
[TaskCategory("Demo")]//特性往编辑器上添加目录,方便查询
public class MoveTowards : Action
{
public float speed;
public SharedTransform target;
public override TaskStatus OnUpdate()
{
Vector3 distance=target.Value.position
if(Vector3.SqrMagnitude(distance)<0.1f)
{
return TaskStatus.Success;
}
transform.position=Vector3.MoveTowards(transform,target.Value.position,speed*Time.deltaTime);
return TaskStatus.Running;
}
}
3、 往主角添加行为树组件,并打开。
4、并在Task任务面板上,添加行为树
5、并在Varibles面板上添加全局变量: (target的赋值在条件类里实现)
6、并在Inspector面板上,为条件类与行为类初始化个属性:
7、运行。
2、编写两个类:一是:条件任务类,二是:行为任务类
tips:引入Behavior.Runtime和Behavior.Runtime.Tasks库。
(1)条件任务类:继承Conditional类
(2)行为任务类:继承Action类
例子:遍历场景内的敌人,是否在视野以内,是则移动,否则不作任何操作。
条件类:
[TaskCategory("Demo")]//特性往编辑器上添加目录,方便查询
public class EnemyInSight : Conditional
{
//目标Trans
public SharedTransform targetTrans;
//场景内的所有敌人
private GameObject[] targetList;
//目标标签
public string targetTag;
//可视角度
public float angle;
public override void OnAwake()
{
targetList=GameObject.FindGameObjectsWithTag(targetTag);
}
public override Taskstatus OnUpdate()
{
for(int i=0;i<targetList.length;++i)
{
if(IsInSight(targetList[i],angle))
{
targetTrans.Value=targetList[i];
return Taskstatus.Success;
}
}
return Taskstatus.Failure;
}
private bool IsInSight(Transform target,float angle)
{
Vector3 direciton=target.position-transform.position;
if(Vector3.Dot(transform.forward,direciton)<angle)
{ return true; }
}
}
行为类:
[TaskCategory("Demo")]//特性往编辑器上添加目录,方便查询
public class MoveTowards : Action
{
public float speed;
public SharedTransform target;
public override TaskStatus OnUpdate()
{
Vector3 distance=target.Value.position
if(Vector3.SqrMagnitude(distance)<0.1f)
{
return TaskStatus.Success;
}
transform.position=Vector3.MoveTowards(transform,target.Value.position,speed*Time.deltaTime);
return TaskStatus.Running;
}
}
3、 往主角添加行为树组件,并打开。
4、并在Task任务面板上,添加行为树
5、并在Varibles面板上添加全局变量: (target的赋值在条件类里实现)
6、并在Inspector面板上,为条件类与行为类初始化个属性:
7、运行。
相关文章推荐
- unity实现多点触控代码
- 在Unity中实现动画的正反播放代码
- unity实现摄像头跟随
- Unity3D上路_01-2D太空射击游戏
- Unity3D上路_02-第一视角射击游戏
- Unity3D上路_03-塔防游戏
- Unity3D上路_04-基础资源介绍
- Unity3D上路_05-网络相关
- [软件资讯]Unity已支持将3D游戏导出成Flash
- Unity 武器拖尾效果
- unity常见问题之20题
- Unity3D动画存储插件
- unity 赛车相机跟随物体移动
- Unity 预编译宏
- Unity AssetDatabase类
- VS2013中 命名空间“UnityEngine”中不存在类型或命名空间名称“UI”。是否缺少程序集引用?
- Unity3D占用内存太大的解决方法
- 【Unity】安卓项目使用带有资源Jar包SDK的打包方法
- Unity2d 5.1 弱联网游戏制作 (一)场景创建、添加组件、精灵移动、主摄像机跟随
- Unity2d 弱联网游戏制作(二) 动画、场景、渲染层、碰撞检测、音乐播放