playmaker可以作为第三方集成到Behavior Designer中使用, 1 http: //www.opsive.com/assets /BehaviorDesigner/documentation .php?id=8
Behavior Designer插件里,主要有四种概念节点,都称之为Task。包括:
1.Composites 组合节点,包括经典的:Sequence,Selector,Parallel
2.Decorator 装饰节点,顾名思义,就是为仅有的一个子节点额外添加一些功能,比如让子task一直运行直到其返回某个运行状态值,或者将task的返回值取反等等
3.Actions 行为节点,行为节点是真正做事的节点,其为叶节点。Behavior Designer插件中自带了不少Action节点,如果不够用,也可以编写自己的Action。一般来说都要编写自己的Action,除非用户是一个不懂脚本的美术或者策划,只想简单地控制一些物件的属性。
4.Conditinals 条件节点 ,用于判断某条件是否成立。目前看来,是Behavior Designer为了贯彻职责单一的原则,将判断专门作为一个节点独立处理,比如判断某目标是否在视野内,其实在攻击的Action里面也可以写,但是这样Action就不单一了,不利于视野判断处理的复用。一般条件节点出现在Sequence控制节点中,其后紧跟条件成立后的Action节点。
新建一个场景,一个箭头模型,和其他四个Sphere 下面代码是方向模型要移动目标的判定,继承于Conditional 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 using UnityEngine; using BehaviorDesigner.Runtime; using BehaviorDesigner.Runtime.Tasks; public class Waitsignt : Conditional { public float fieldofviewangle; public string targettag; public SharedTransform target; private Transform[] possibletargets; public override void OnAwake () { var targets = GameObject.FindGameObjectsWithTag (targettag); possibletargets = new Transform[targets.Length]; for (int i = 0 ; i < targets.Length; i++) { possibletargets[i] = targets[i].transform; } } public override TaskStatus OnUpdate () { for (int i = 0 ; i < possibletargets.Length; ++i) { if (withinsight (possibletargets [i], fieldofviewangle)) { target.Value = possibletargets[i]; Debug.Log (target.Value ); return TaskStatus.Success; } } return TaskStatus.Failure; } public bool withinsight (Transform targetTransform, float filedofViewAngle) { Vector3 dirction = targetTransform.position - transform.position; return Vector3.Angle (dirction,transform.forward)<filedofViewAngle; } }
下面代码是方向模型要移动到目标的代码,继承于Action 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 using UnityEngine; using BehaviorDesigner.Runtime.Tasks; using BehaviorDesigner.Runtime; public class Eventtype : Action { public float speed = 0 ; public SharedTransform target ; public override TaskStatus OnUpdate () { if (Vector3.SqrMagnitude (transform.position - target .Value .position ) < 0. f) { return TaskStatus.Success; } transform.position = Vector3.MoveTowards (transform.position ,target .Value .position ,speed*Time.deltaTime); transform.LookAt (target .Value ); return TaskStatus.Running; } }
在unity打开Behavior Designer,在task中找到对应
Waitsignt 属性
Eventtype 属性
运行就可以看到官网例子效果了