• 注册
欢迎加入behaviac Q&A网站。behaviac是腾讯开源组件https://github.com/TencentOpen/behaviac 官方网站:http://www.behaviac.com/,提供各种文档和教程及手册 为了您及时的获得您最新问题的评论或者回答,请提供并验证您的邮箱
欢迎来到 behaviac Q&A。 您在bbs里的问题,管理员会当下就收到通知,不要担心管理员看不到您的问题。也请在bbs里提供您的email,这样就可以第一时间收到关于回答,评论的email的通知了。 为了节省大家的时间,请表达好你的问题,提供必要上下文,版本号,平台信息,重现步骤等。

action节点.设置决定状态的函数时. 本身action节点不被执行

0 喜欢 0 不喜欢
150 浏览
    public SceneObject GetTarget(float message)
    {
        Debug.Log(message);
        //TODO 获取目标
        return curTarget_;
        //SceneObject target = TodoGetTarget();
        //return target;
    }
    public behaviac.EBTStatus MoveToTarget(SceneObject target)
    {
        //target = curTarget_;
        if(virtualMoveJoyStickController != null)
        {
            if(target != null)
            {
                Vector3 point = target.transform.position + new Vector3(1, 0, 1);
                return MoveToPoint(point);
            }
        }
        return behaviac.EBTStatus.BT_FAILURE;
    }

如上图.制作了action节点设置action 为 GetTarget(float)

同时设置决定状态的函数为MoveToTarget..

通过断点发现个GetTarget未执行(导致传入MoveToTarget传入的参数为空)..而MovetToTarget执行了..

 

而如下的相同使用

    public List<SceneObject> SearchEnemy(eSearchType type, float param0, float param1)
    {
        switch(type)
        {
            case eSearchType.Rectangle:
                return SearchRectangleEnemy(param0, param1);
            case eSearchType.Sector:
                return SearchRectangleEnemy(param0, param1);
            case eSearchType.Cirle:
                return SearchCircleEnemy(param0);
        }
        return null;
    }
    public behaviac.EBTStatus SetTargetList(List<SceneObject> targets)
    {
        if (targets != null && targets.Count > 0)
        {
            //TODO 设定目标列表
            TodoSetTargetList(targets);
            return behaviac.EBTStatus.BT_SUCCESS;
        }
        return behaviac.EBTStatus.BT_FAILURE;
    }

 

2个函数都顺利执行..通过阅读生成的AgentProperties.cs文件发现.

MoveToTarget生成了对应子类通过如下代码调用

			public override void Run(Agent self)
			{
				Debug.Check(_param0 != null);

				Agent agent = Utils.GetParentAgent(self, _instance);

				_returnValue.value = ((AiAgent)agent).MoveToTarget((SceneObject)_param0.GetValueObject(self));
			}

而SetTargetList通过注册时method调用

			meta.RegisterMethod(1120014259, new CAgentMethod<behaviac.EBTStatus, List<SceneObject>>(delegate(Agent self, List<SceneObject> param0) { return ((AiAgent)self).SetTargetList(param0); }));

 

求教.这是怎么回事..

最新提问 8月 23, 2016 用户: qq_57bc0d701ec50 (270 分)
多谢反馈,在排查中。。。

明天争取反馈你

2 个回答

0 喜欢 0 不喜欢
我添加了testcase,工作很正常。

还有AgentProperties.cs中MoveToTarget生成的对应子类没有问题。

或者你可以看生成的generated_behaviors.cs中的相关部分。

你如果还有问题,需要提供更多信息,比如你的workspace
最新回答 8月 24, 2016 用户: jonygli (58,570 分)
public class TestClassA { }
[behaviac.TypeMetaInfo()]
public class AiAgent : BaseAgent
{
    private List<SceneObject> targetList_;
    private SceneObject curTarget_;
    private List<Skill> skillList_;
    private Skill curSkill_;
    [behaviac.MemberMetaInfo()] public bool isInit = false;
    [behaviac.MemberMetaInfo()] public bool canMove = false;
    [behaviac.MemberMetaInfo()] public bool skillMove = false;
    [behaviac.MemberMetaInfo()] public bool castSkill = false;

    [behaviac.MethodMetaInfo()]
    public float TestFunA()
    {
        Debug.Log("On TestFunA.");
        return 666;
    }

    [behaviac.MethodMetaInfo()]
    public behaviac.EBTStatus TestFunB(float testFloat)
    {
        Debug.Log(testFloat);
        return behaviac.EBTStatus.BT_SUCCESS;
    }
    [behaviac.MethodMetaInfo()]
    public TestClassA TestFunC()
    {
        Debug.Log("On TestFunC");
        return new TestClassA();
    }
    [behaviac.MethodMetaInfo()]
    public behaviac.EBTStatus TestFuncD(TestClassA fun)
    {
        Debug.Log(fun == null);
        return behaviac.EBTStatus.BT_SUCCESS;
    }

测试代码如上.

测试ai如下.

输出结果为On TestFunA

666

True

但是如果把

behaviac.Workspace.Instance.FileFormat改为cs

就恢复了正常..怀疑可能是从xml执行的逻辑有问题..

正在排查中.

好的,已发现问题。fix中,晚些时候会发布一个新版本
0 喜欢 0 不喜欢
最新回答 8月 24, 2016 用户: jonygli (58,570 分)
...