Exemple #1
0
    /// <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);
    }
Exemple #2
0
    public override void OnDestroy()
    {
        if (mBehaviourTree != null)
        {
            ObjCachePoolMgr.Instance.RecycleCSharpObject(mBehaviourTree, ObjCachePoolType.AI, mBehaviourTree.GetName());
            mBehaviourTree = null;
        }

        mAIFile = "";
    }
Exemple #3
0
    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);
    }
Exemple #4
0
    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);
    }
Exemple #5
0
    /// <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();
    }
Exemple #6
0
    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);
        }
    }
Exemple #7
0
    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();
    }
Exemple #8
0
 private void SetBehaviourTree(BehaviourTree.BehaviourTree behaviourTree)
 {
     mBehaviourTree = behaviourTree;
 }
 protected override void OnEnter(BehaviourTree tree)
 {
     mCurrentNodeIndex = 0;
 }
Exemple #10
0
 protected abstract ENodeReturn OnUpdate(BehaviourTree tree);
Exemple #11
0
 protected virtual void OnExit(BehaviourTree tree)
 {
 }
Exemple #12
0
 protected virtual void OnEnter(BehaviourTree tree)
 {
 }
Exemple #13
0
        protected override ENodeReturn OnUpdate(BehaviourTree tree)
        {
            ENodeReturn rt = RootNode.Run(tree);

            return(rt);
        }
 void OnEnable()
 {
     behaviourTree = serializedObject.targetObject as BehaviourTree;
 }