/// <summary> /// 先试图从预加载的bundle缓存中加载ai文件 /// </summary> /// <param name="ai_file"></param> bool TryLoadAIFileImmediate(string ai_file) { // 先从缓存中读取ai文件的资源 string path = string.Format(AI_PATH_PREFIX + "/{0}", ai_file); var text_asset = ResourceLoader.Instance.try_load_cached_asset(path) as TextAsset; if (text_asset == null) { return(false); } // 解析失败则将Hashtable对象放回内存池 var options = MiniJSON.JsonDecode(text_asset.text) as Hashtable; if (options == null) { //Resources.UnloadAsset(text_asset); return(false); } //Resources.UnloadAsset(text_asset); // 解析成功创建BehaviourTree对象 var behaviourTree = new BehaviourTree.BehaviourTree(ai_file, options, this); ObjCachePoolMgr.Instance.RecycleCSharpObject(options, ObjCachePoolType.AIJSON, ai_file); SetBehaviourTree(behaviourTree); return(true); }
public override void OnDestroy() { if (mBehaviourTree != null) { ObjCachePoolMgr.Instance.RecycleCSharpObject(mBehaviourTree, ObjCachePoolType.AI, mBehaviourTree.GetName()); mBehaviourTree = null; } mAIFile = ""; }
public void Setup() { Node moveToTargetNode = new MoveToTarget(this); Player player = (MainController.GetControllerOfType(typeof(PlayerController)) as PlayerController).Player; freeze = new Sequence( new CanSeeWhisp(this, viewRange), new Inverter(new IsPlayerCloserThanWhisps(this, viewRange)), new SetFrozen(this), new Monitor( new DoNothing(), new IsFrozen(this)) ); bringFragmentToPlayer = new Monitor( new ActiveSelector( new Monitor( new Sequence( new SetTargetLookPosition(this, Helpers.PlayerPosition), new LookAtTarget(this)), new IsPlayerWithinRange(this, maxOfferFragmentDistance)), new Sequence( new SetTargetMovePosition(this, Helpers.PlayerPosition), moveToTargetNode)), new HasFragment(this) ); collectFragment = new Sequence( new IsFragmentNear(this), new SetTargetFragment(this), new Monitor( new Sequence( new SetTargetMovePosition(this, Helpers.CurrentFragmentTarget), moveToTargetNode, new PickupFragment(this)), new IsTargetFragmentAlive(this)) ); followPlayer = new ActiveSelector( new Sequence( new Inverter(new IsPlayerWithinRange(this, maxFollowPlayerDistance)), new SetTargetMovePosition(this, Helpers.PlayerPosition), moveToTargetNode), new Sequence( new SetTargetMovePosition(this, Helpers.RandomPosition), moveToTargetNode, new WaitRandom(0.5f, 2f)) ); ActiveSelector RootSelector = new ActiveSelector(freeze, bringFragmentToPlayer, collectFragment, followPlayer); BehaviourTree = new BehaviourTree.BehaviourTree(RootSelector); }
public void Setup() { Node moveToTargetNode = new MoveToTarget(this); Player player = (MainController.GetControllerOfType(typeof(PlayerController)) as PlayerController).Player; Node canSeePlayerNode = new CanSeeAgent(this, player, playerViewRange); fleeingAction = new Sequence( canSeePlayerNode, new IsPlayerWithinRange(this, PlayerFleeRange), new InvokeDelegate(SetLastFleeTimeToNow), new SetTargetMovePosition(this, Helpers.AwayFromPlayer), moveToTargetNode ); allertingAction = new ActiveSelector( new Monitor( new Sequence( new SetTargetLookPosition(this, Helpers.PlayerPosition), new LookAtTarget(this)), canSeePlayerNode), new Monitor( new Sequence( new SetTargetLookPosition(this, Helpers.RandomPosition), new LookAtTarget(this)), new HasFledRecently(this)) ); exploringAction = new ActiveSelector( new Sequence( new IsFragmentNear(this), new SetTargetFragment(this), new Monitor( new Sequence( new SetTargetMovePosition(this, Helpers.CurrentFragmentTarget), moveToTargetNode, new PickupFragment(this)), new IsTargetFragmentAlive(this))), new Sequence( new Inverter(new HasMovedRecently(this)), new SetTargetMovePosition(this, Helpers.RandomPosition), moveToTargetNode) ); idleAction = new WaitRandom(2, 4); ActiveSelector RootSelector = new ActiveSelector(fleeingAction, allertingAction, exploringAction, idleAction); BehaviourTree = new BehaviourTree.BehaviourTree(RootSelector); }
/// <summary> /// 加载ai对应的文件 /// </summary> /// <param name="aiFile"></param> /// <returns></returns> private IEnumerator LoadAIFile(string aiFile) { SGameEngine.AssetResource result = new SGameEngine.AssetResource(); string path = string.Format(AI_PATH_PREFIX + "/{0}", aiFile); yield return(MainGame.HeartBehavior.StartCoroutine(SGameEngine.ResourceLoader.Instance.load_asset(path, typeof(TextAsset), result))); if (result.asset_ == null) { GameDebug.LogError("BehaviourAI::LoadAIFile, read ai file error 1:" + aiFile); yield break; } TextAsset textAsset = result.asset_ as TextAsset; if (textAsset == null) { Debug.LogError("BehaviourAI::LoadAIFile,can not read ai file:" + aiFile); yield break; } var options = MiniJSON.JsonDecode(textAsset.text) as Hashtable; if (options == null) { result.destroy(); yield break; } var behaviourTree = new BehaviourTree.BehaviourTree(aiFile, options, this); ObjCachePoolMgr.Instance.RecycleCSharpObject(options, ObjCachePoolType.AIJSON, aiFile); SetBehaviourTree(behaviourTree); result.destroy(); }
private void InitBehaivorTree() { string aiRawFiles = GetBehaivorTreeFile(); if (string.IsNullOrEmpty(aiRawFiles)) { return; } string aiFile = aiRawFiles; mAIFile = aiRawFiles; BehaviourTree.BehaviourTree behaviourTree = ObjCachePoolMgr.Instance.TryLoadCSharpObject <BehaviourTree.BehaviourTree>(ObjCachePoolType.AI, aiFile); if (behaviourTree == null) { Hashtable options = ObjCachePoolMgr.Instance.TryLoadCSharpObject <Hashtable>(ObjCachePoolType.AIJSON, aiFile); if (options == null) { if (!TryLoadAIFileImmediate(aiFile)) { MainGame.HeartBehavior.StartCoroutine(LoadAIFile(aiFile)); } } else { behaviourTree = new BehaviourTree.BehaviourTree(aiFile, options, this); ObjCachePoolMgr.Instance.RecycleCSharpObject(options, ObjCachePoolType.AIJSON, aiFile); SetBehaviourTree(behaviourTree); } } else { behaviourTree.Reset(this); SetBehaviourTree(behaviourTree); } }
public override void Active() { // Temp Test //UnityEngine.Time.timeScale = 0.1f; //mRunningProperty.TargetActor = GetDefaultTargetActor(); mRunningProperty.RefreshState(); mFunction.RunningProperty = mRunningProperty; mCurrentBehaviourTree = GetBehaviourTree(); if (mCurrentBehaviourTree != null) { mCurrentBehaviourTree.Run(); } ActiveImplement(); mPathWalker.Update(); mAmbient.Update(); mMachine.Update(); }
private void SetBehaviourTree(BehaviourTree.BehaviourTree behaviourTree) { mBehaviourTree = behaviourTree; }
protected override void OnEnter(BehaviourTree tree) { mCurrentNodeIndex = 0; }
protected abstract ENodeReturn OnUpdate(BehaviourTree tree);
protected virtual void OnExit(BehaviourTree tree) { }
protected virtual void OnEnter(BehaviourTree tree) { }
protected override ENodeReturn OnUpdate(BehaviourTree tree) { ENodeReturn rt = RootNode.Run(tree); return(rt); }
void OnEnable() { behaviourTree = serializedObject.targetObject as BehaviourTree; }