Behavior Designer加强版的playmaker

playmaker可以作为第三方集成到Behavior Designer中使用,

1
http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=8

Behavior Designer插件里,主要有四种概念节点,都称之为Task。包括:
16010501

1.Composites  组合节点,包括经典的:Sequence,Selector,Parallel

2.Decorator 装饰节点,顾名思义,就是为仅有的一个子节点额外添加一些功能,比如让子task一直运行直到其返回某个运行状态值,或者将task的返回值取反等等

3.Actions     行为节点,行为节点是真正做事的节点,其为叶节点。Behavior Designer插件中自带了不少Action节点,如果不够用,也可以编写自己的Action。一般来说都要编写自己的Action,除非用户是一个不懂脚本的美术或者策划,只想简单地控制一些物件的属性。

4.Conditinals 条件节点 ,用于判断某条件是否成立。目前看来,是Behavior Designer为了贯彻职责单一的原则,将判断专门作为一个节点独立处理,比如判断某目标是否在视野内,其实在攻击的Action里面也可以写,但是这样Action就不单一了,不利于视野判断处理的复用。一般条件节点出现在Sequence控制节点中,其后紧跟条件成立后的Action节点。

按照官方视频,实现简单的例子(http://www.opsive.com/assets/BehaviorDesigner/videos.php?id=3)

新建一个场景,一个箭头模型,和其他四个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中找到对应

16010501

场景中的四个Sphere tag设置成Target,在Behavior Designer Variables增加一个类型为transform名字为Target的全局值,会在代码中SharedTransform 中显示

Waitsignt 属性

16010501

Eventtype 属性

16010501

运行就可以看到官网例子效果了