• 注册
欢迎加入behaviac Q&A网站。behaviac是腾讯开源组件https://github.com/TencentOpen/behaviac 官方网站:http://www.behaviac.com/,提供各种文档和教程及手册 为了您及时的获得您最新问题的评论或者回答,请提供并验证您的邮箱

实例化相关的Agent

0 喜欢 0 不喜欢
955 浏览

如楼主所诉,有多个怪物使用相同的Agent类型的时候

behaviac.Agent.RegisterInstanceName<AgentNodeTest>();

 然后绑定,

behaviac.Agent.BindInstance(nodeTestAgent, "AgentNodeTest");

当调用多次的时候,最后一个绑定的获得RegisterInstanceName的实例。

 

当我需要多个的时候就得这样

behaviac.Agent.RegisterInstanceName<AgentNodeTest>("test1");

behaviac.Agent.RegisterInstanceName<AgentNodeTest>("test2");

behaviac.Agent.RegisterInstanceName<AgentNodeTest>("test3");

behaviac.Agent.RegisterInstanceName<AgentNodeTest>("test4");

 

behaviac.Agent.BindInstance(nodeTestAgent1, "test1");

behaviac.Agent.BindInstance(nodeTestAgent2, "test2");

behaviac.Agent.BindInstance(nodeTestAgent3, "test3");

behaviac.Agent.BindInstance(nodeTestAgent4, "test4");

然后通过get获取。

 

可不可以只register一次(想了解一下register过程是什么,消耗么?),通过create来获取Agent类型的实例。通过内存的copy(这样性能会不会好点?) 

例如如下的样子

public object Clone() 
  { 
  using (MemoryStream ms = new MemoryStream(1000)) 
  { 
  object CloneObject; 
  BinaryFormatter bf = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone)); 
  bf.Serialize(ms, this); 
  ms.Seek(0, SeekOrigin.Begin); 
  // 反序列化至另一个对象(即创建了一个原对象的深表副本) 
  CloneObject = bf.Deserialize(ms); 
  // 关闭流 
  ms.Close(); 
  return CloneObject; 
  } 

 

最新提问 8月 1, 2016 用户: qq_575020060c761 (300 分)

1个回答

0 喜欢 0 不喜欢
 
已采纳
对于Agent实例,在运行时端(游戏端)的各种Agent或其子类实例的名字注册和绑定的设计意图,主要是为了支持单件(Singleton)或者类似确定的全局性的实例(同一个类可能会有若干个实例而不是仅仅有一个实例),例如:player,camera,director等。

只有通过RegisterInstanceName注册过的“名字”才在导出元信息时被导出;而BindInstance和Create等与实例相关的函数在执行行为树的时候才需要,如果只是导出元信息则不需要。

RegisterInstanceName是非常高效的,它本身只是注册名字用的。 BindInstance 和GetInstance也是高效的,本质上只是对Dictionary(Map)的操作。

 

有多少个不同的名字,就需要注册多少次。但注册后,同一个名字可以绑定不同的实例。
最新回答 8月 1, 2016 用户: jonygli (57,510 分)
采纳于 9月 26, 2016 用户:qq_575020060c761
Agent实例绑定
...