Пример #1
0
    // Use this for initialization
    void Start()
    {
        // 决策初始化
        IdleEnter      = ShieldMan.IdleEnter;
        IdleExit       = ShieldMan.IdleExit;
        IdleFeedbacker = ShieldMan.IdleFeedbacker;
        IdleActioner   = ShieldMan.IdleAction;

        ApproachEnter      = ShieldMan.ApproachEnter;
        ApproachExit       = ShieldMan.ApproachExit;
        ApproachFeedbacker = ShieldMan.ApproachFeedbacker;
        ApproachActioner   = ShieldMan.ApproachAction;

        AttackEnter      = ShieldMan.AttackEnter;
        AttackExit       = ShieldMan.AttackExit;
        AttackFeedbacker = ShieldMan.AttackFeedbacker;
        AttackActioner   = ShieldMan.AttackAction;

        EscapeEnter      = ShieldMan.EscapeEnter;
        EscapeExit       = ShieldMan.EscapeExit;
        EscapeFeedbacker = ShieldMan.EscapeFeedbacker;
        EscapeActioner   = ShieldMan.EscapeAction;

        BlockEnter      = ShieldMan.BlockEnter;
        BlockExit       = ShieldMan.BlockExit;
        BlockFeedbacker = ShieldMan.BlockFeedbacker;
        BlockActioner   = ShieldMan.BlockAction;

        DeathEnter      = ShieldMan.DeathEnter;
        DeathExit       = ShieldMan.DeathExit;
        DeathFeedbacker = ShieldMan.DeathFeedbacker;
        DeathActioner   = ShieldMan.DeathAction;

        // 动画
        idleAnim        = ShieldMan.SM_idle_Anim;
        walkAnim        = ShieldMan.SM_walk_Anim;
        runAnim         = ShieldMan.SM_run_Anim;
        shieldWalkAnim  = ShieldMan.SM_shield_walk_Anim;
        shieldWalkBAnim = ShieldMan.SM_shield_walkB_Anim;
        shieldStopAnim  = ShieldMan.SM_shield_stop_Anim;
        dieAnim         = ShieldMan.SM_die_Anim;
        hookAnim        = ShieldMan.SM_hook_Anim;
        chargeAnim      = ShieldMan.SM_charge_Anim;
        attackAnim      = ShieldMan.SM_attack_Anim;
        viglianceAnim   = ShieldMan.SM_vigilance_Anim;

        mRecorder = ShieldMan.SM_Recorder;

        // 节点
        roundEnter     = ShieldMan.SM_Round_Enter;
        roundState     = ShieldMan.SM_Round;
        roundExit      = ShieldMan.SM_Round_Exit;
        restEnter      = ShieldMan.SM_Rest_Enter;
        restState      = ShieldMan.SM_Rest;
        restExit       = ShieldMan.SM_Rest_Exit;
        vigilanceEnter = ShieldMan.SM_Vigilance_Enter;
        vigilanceState = ShieldMan.SM_Vigilance;
        vigilanceExit  = ShieldMan.SM_Vigilance_Exit;
        searchEnter    = ShieldMan.SM_Search_Enter;
        searchState    = ShieldMan.SM_Search;
        searchExit     = ShieldMan.SM_Search_Exit;

        chargeEnter   = ShieldMan.SM_Charge_Enter;
        chargeState   = ShieldMan.SM_Charge;
        chargeExit    = ShieldMan.SM_Charge_Exit;
        hookEnter     = ShieldMan.SM_Hook_Enter;
        hookState     = ShieldMan.SM_Hook;
        hookExit      = ShieldMan.SM_Hook_Exit;
        attackEnter   = ShieldMan.SM_Attack_Enter;
        attackState   = ShieldMan.SM_Attack;
        attackExit    = ShieldMan.SM_Attack_Exit;
        runawayEnter  = ShieldMan.SM_Runaway_Enter;
        runawayState  = ShieldMan.SM_Runaway;
        runawayExit   = ShieldMan.SM_Runaway_Exit;
        walkawayEnter = ShieldMan.SM_Walkaway_Enter;
        walkawayState = ShieldMan.SM_Walkaway;
        walkawayExit  = ShieldMan.SM_Walkaway_Exit;
        chaseEnter    = ShieldMan.SM_Chase_Enter;
        chaseState    = ShieldMan.SM_Chase;
        chaseExit     = ShieldMan.SM_Chase_Exit;
        shieldFEnter  = ShieldMan.SM_ShieldF_Enter;
        shieldFState  = ShieldMan.SM_ShieldF;
        shieldFExit   = ShieldMan.SM_ShieldF_Exit;
        shieldSEnter  = ShieldMan.SM_ShieldS_Enter;
        shieldSState  = ShieldMan.SM_ShieldS;
        shieldSExit   = ShieldMan.SM_ShieldS_Exit;
        shieldBEnter  = ShieldMan.SM_ShieldB_Enter;
        shieldBState  = ShieldMan.SM_ShieldB;
        shieldBExit   = ShieldMan.SM_ShieldB_Exit;
        dieEnter      = ShieldMan.SM_Die_Enter;
        dieState      = ShieldMan.SM_Die;
        dieExit       = ShieldMan.SM_Die_Exit;

        //转换
        roundtorest       = ShieldMan.SM_Round_Rest;
        resttoround       = ShieldMan.SM_Rest_Round;
        roundtovigilance  = ShieldMan.SM_Rest_Vigilance;
        vigilancetoround  = ShieldMan.SM_Vigilance_Round;
        resttovigilance   = ShieldMan.SM_Rest_Vigilance;
        vigilancetosearch = ShieldMan.SM_Vigilance_Search;
        searchtoround     = ShieldMan.SM_Search_Round;
        chasetoshieldF    = ShieldMan.SM_Chase_ShieldF;
        shieldFtochase    = ShieldMan.SM_ShieldF_Chase;
        anytohook         = ShieldMan.SM_Any_Hook;
        anytocharge       = ShieldMan.SM_Any_Charge;
        chargetoshieldF   = ShieldMan.SM_Charge_ShieldF;
        hooktoshieldF     = ShieldMan.SM_Hook_ShieldF;
        shieldStoattack   = ShieldMan.SM_ShieldS_Attack;
        attacktoshieldS   = ShieldMan.SM_Attack_ShieldS;
        shieldFtoshieldS  = ShieldMan.SM_ShieldF_ShieldS;
        shieldStoshieldF  = ShieldMan.SM_ShieldS_ShieldF;
        shieldBtowalkaway = ShieldMan.SM_ShieldB_Walkaway;
        walkawaytoshieldB = ShieldMan.SM_Walkaway_ShieldB;
        walkawaytorunaway = ShieldMan.SM_Walkaway_Runaway;
        runawaytowalkaway = ShieldMan.SM_Runaway_Walkaway;

        // 决策反馈函数
        near       = ShieldMan.SM_Near;
        far        = ShieldMan.SM_Far;
        staLose    = ShieldMan.SM_StaLose;
        staRecover = ShieldMan.SM_StaRecover;
        hurtup     = ShieldMan.SM_HurtUp;

        // 情感
        despair = ShieldMan.SM_Despair_Emotion;
        normal  = ShieldMan.SM_Normal_Emotion;
        angry   = ShieldMan.SM_Angry_Emotion;
        excited = ShieldMan.SM_Excited_Emotion;

        // 生成指定个数单位
        for (int i = 0; i < count; i++)
        {
            AIEntity mAIEntity   = new AIEntity();
            UEntity  mPlayer     = new UEntity();
            UEntity  mPlayerLast = new UEntity();

            ECSWorld.MainWorld.registerEntityAfterInit(mAIEntity);

            ECSWorld.MainWorld.registerEntityAfterInit(mPlayer);

            mAIEntity.mAI          = shieldAI;
            mAIEntity.mPlayer      = player;
            mAIEntity.PlayerEntity = mPlayer;

            mAIEntity.AIPos = new Vector3(
                gameObject.transform.position.x + Random.Range(-randomRange, randomRange), 0,
                gameObject.transform.position.z + Random.Range(-randomRange, randomRange));

            mAIEntity.Init();

            mAIEntity.AddComponent <shieldAI> (new shieldAI());
            mAIEntity.AddComponent <staComponent> (new staComponent());
            mAIEntity.AddComponent <SSHComponent> (new SSHComponent());
            mAIEntity.AddComponent <showAll> (new showAll());
            mAIEntity.AddComponent <getPlayer> (new getPlayer());
            mAIEntity.AddComponent <GYTHPComponent> (new GYTHPComponent());

            mAIEntity.GetComponent <BaseAIComponent> ().mAIRT.SetActive(true);

            mAIEntity.GetComponent <GYTHPComponent> ().HP    = mAIEntity.GetComponent <SSHComponent> ().HP;
            mAIEntity.GetComponent <GYTHPComponent> ().HPNow = mAIEntity.GetComponent <SSHComponent> ().HP;

            animator = mAIEntity.GetComponent <BaseAIComponent> ().mAIRT.GetComponent <Animator> ();
            mAIEntity.GetComponent <AIAnimation> ().mAnimator = animator;

            mAIEntity.GetComponent <AIAnimation> ().Add("Idle", idleAnim);
            mAIEntity.GetComponent <AIAnimation> ().Add("Walk", walkAnim);
            mAIEntity.GetComponent <AIAnimation> ().Add("Run", runAnim);
            mAIEntity.GetComponent <AIAnimation> ().Add("ShieldWalk", shieldWalkAnim);
            mAIEntity.GetComponent <AIAnimation> ().Add("ShieldWalkBack", shieldWalkBAnim);
            mAIEntity.GetComponent <AIAnimation> ().Add("ShieldStop", shieldStopAnim);
            mAIEntity.GetComponent <AIAnimation> ().Add("Die", dieAnim);
            mAIEntity.GetComponent <AIAnimation> ().Add("Hook", hookAnim);
            mAIEntity.GetComponent <AIAnimation> ().Add("Charge", chargeAnim);
            mAIEntity.GetComponent <AIAnimation> ().Add("Attack", attackAnim);
            mAIEntity.GetComponent <AIAnimation> ().mtempAnim = "Idle";

            mAIEntity.GetComponent <AIEmotion> ().InsertEmotion("Despair");
            mAIEntity.GetComponent <AIEmotion> ().InsertEmotion("Normal");
            mAIEntity.GetComponent <AIEmotion> ().InsertEmotion("Angry");
            mAIEntity.GetComponent <AIEmotion> ().InsertEmotion("Excited");

            mAIEntity.GetComponent <AIEmotion> ().InsertEdge("Despair", despair);
            mAIEntity.GetComponent <AIEmotion> ().InsertEdge("Normal", normal);
            mAIEntity.GetComponent <AIEmotion> ().InsertEdge("Angry", angry);
            mAIEntity.GetComponent <AIEmotion> ().InsertEdge("Excited", excited);


            // 巡逻决策
            AIState state_idle = new AIState();
            state_idle.Init();
            state_idle.mName          = "SMidle";
            state_idle.mStateRecorder = mRecorder;
            state_idle.LastEntityData.AddComponent <SMREComponent> (new SMREComponent());

            int idle_round     = state_idle.AddExecuter(roundState, roundExit, roundEnter);
            int idle_rest      = state_idle.AddExecuter(restState, restExit, restEnter);
            int idle_vigilance = state_idle.AddExecuter(vigilanceState, vigilanceExit, vigilanceEnter);
            int idle_search    = state_idle.AddExecuter(searchState, searchExit, searchEnter);

            state_idle.AddStateName(idle_round, "Round");
            state_idle.AddStateName(idle_rest, "Rest");
            state_idle.AddStateName(idle_vigilance, "Vigilance");
            state_idle.AddStateName(idle_search, "Search");


            state_idle.AddDoubleEdge(roundtorest, resttoround, EmptyFeedbacker.Run,
                                     EmptyFeedbacker.Run, idle_round, idle_rest);
            state_idle.AddDoubleEdge(roundtovigilance, vigilancetoround, EmptyFeedbacker.Run,
                                     EmptyFeedbacker.Run, idle_round, idle_vigilance);
            state_idle.AddEdge(resttovigilance, EmptyFeedbacker.Run, idle_rest, idle_vigilance);
            // 一个反馈,距离接近
            state_idle.AddEdge(vigilancetosearch, near, idle_vigilance, idle_search);
            state_idle.AddEdge(searchtoround, EmptyFeedbacker.Run, idle_search, idle_round);

            state_idle.AddAnimation(roundState, "Walk");
            state_idle.AddAnimation(restState, "Idle");
            state_idle.AddAnimation(vigilanceState, "Idle");
            state_idle.AddAnimation(searchState, "Walk");

            state_idle.tempID = idle_round;

            int id1 = mAIEntity.GetComponent <AIStrategy> ().AddStrategy(IdleActioner, IdleEnter, IdleExit, IdleFeedbacker, state_idle);
            mAIEntity.GetComponent <AIStrategy> ().AddName(id1, "Idle");


            // 接近决策
            AIState state_approach = new AIState();
            state_approach.Init();
            state_approach.mName          = "SMapproach";
            state_approach.mStateRecorder = mRecorder;
            state_approach.LastEntityData.AddComponent <SMREComponent> (new SMREComponent());

            int approach_hook    = state_approach.AddExecuter(hookState, hookExit, hookEnter);
            int approach_charge  = state_approach.AddExecuter(chargeState, chargeExit, chargeEnter);
            int approach_chase   = state_approach.AddExecuter(chaseState, chaseExit, chaseEnter);
            int approach_shieldF = state_approach.AddExecuter(shieldFState, shieldFExit, shieldFEnter);

            state_approach.AddStateName(approach_hook, "Hook");
            state_approach.AddStateName(approach_charge, "Charge");
            state_approach.AddStateName(approach_chase, "Chase");
            state_approach.AddStateName(approach_shieldF, "ShieldF");

            // 首先考虑到出钩和冲撞是个开关节点,执行完动作后就会退出,不需要反馈
            state_approach.AddAnywayTranfer(anytohook, EmptyFeedbacker.Run, approach_hook);
            state_approach.AddAnywayTranfer(anytocharge, EmptyFeedbacker.Run, approach_charge);

            state_approach.AddEdge(hooktoshieldF, EmptyFeedbacker.Run, approach_hook, approach_shieldF);
            state_approach.AddEdge(chargetoshieldF, EmptyFeedbacker.Run, approach_charge, approach_shieldF);

            state_approach.AddDoubleEdge(chasetoshieldF, shieldFtochase, staRecover, near, approach_chase, approach_shieldF);

            state_approach.AddAnimation(hookState, "Hook");             // 注意,绑定的是放慢版的出拳
            state_approach.AddAnimation(chargeState, "Charge");
            state_approach.AddAnimation(chaseState, "Run");
            state_approach.AddAnimation(shieldFState, "ShieldWalk");

            state_approach.tempID = approach_chase;


            int id2 = mAIEntity.GetComponent <AIStrategy> ().AddStrategy(ApproachActioner, ApproachEnter, ApproachExit, ApproachFeedbacker, state_approach);
            mAIEntity.GetComponent <AIStrategy> ().AddName(id2, "Approach");

            // 攻击决策
            AIState state_attack = new AIState();
            state_attack.Init();
            state_attack.mName          = "SMattack";
            state_attack.mStateRecorder = mRecorder;
            state_attack.LastEntityData.AddComponent <SMREComponent> (new SMREComponent());
            // 排列顺序(word中),从左到右,从上到下
            int attack_shieldF = state_attack.AddExecuter(shieldFState, shieldFExit, shieldFEnter);
            int attack_attack  = state_attack.AddExecuter(attackState, attackExit, attackEnter);
            int attack_shieldS = state_attack.AddExecuter(shieldSState, shieldSExit, shieldSEnter);

            state_attack.AddStateName(attack_shieldF, "ShieldF");
            state_attack.AddStateName(attack_attack, "Attack");
            state_attack.AddStateName(attack_shieldS, "ShieldS");

            // 举盾接近到停止,可以理解为为了恢复体力;停止到举盾接近,可以理解为为了接近
            state_attack.AddDoubleEdge(shieldFtoshieldS, shieldStoshieldF, staRecover, near, attack_shieldF, attack_shieldS);
            // 前部略,后部则是因为攻击节点,造成伤害最吼
            state_attack.AddDoubleEdge(attacktoshieldS, shieldStoattack, staRecover, hurtup, attack_attack, attack_shieldS);
            state_attack.AddAnimation(shieldFState, "ShieldWalk");
            state_attack.AddAnimation(attackState, "Attack");
            state_attack.AddAnimation(shieldSState, "ShieldStop");

            state_attack.tempID = attack_shieldF;            // 先接近总是没毛病

            int id3 = mAIEntity.GetComponent <AIStrategy> ().AddStrategy(AttackActioner, AttackEnter, AttackExit, AttackFeedbacker, state_attack);
            mAIEntity.GetComponent <AIStrategy> ().AddName(id3, "Attack");

            // 逃跑
            AIState state_escape = new AIState();
            state_escape.Init();
            state_escape.mName          = "SMescape";
            state_escape.mStateRecorder = mRecorder;
            state_escape.LastEntityData.AddComponent <SMREComponent> (new SMREComponent());

            int escape_shieldB  = state_escape.AddExecuter(shieldBState, shieldFExit, shieldFEnter);
            int escape_walkaway = state_escape.AddExecuter(walkawayState, walkawayExit, walkawayEnter);
            int escape_runaway  = state_escape.AddExecuter(runawayState, runawayExit, runawayEnter);

            state_escape.AddStateName(escape_shieldB, "ShieldB");
            state_escape.AddStateName(escape_walkaway, "Walkaway");
            state_escape.AddStateName(escape_runaway, "Runaway");

            state_escape.AddDoubleEdge(shieldBtowalkaway, walkawaytoshieldB, far, far, escape_shieldB, escape_walkaway);
            state_escape.AddDoubleEdge(walkawaytorunaway, runawaytowalkaway, far, staRecover, escape_walkaway, escape_runaway);

            state_escape.AddAnimation(shieldBState, "ShieldWalkBack");
            state_escape.AddAnimation(walkawayState, "Walk");
            state_escape.AddAnimation(runawayState, "Run");

            state_escape.tempID = escape_shieldB;

            int id4 = mAIEntity.GetComponent <AIStrategy> ().AddStrategy(EscapeActioner, EscapeEnter, EscapeExit, EscapeFeedbacker, state_escape);
            mAIEntity.GetComponent <AIStrategy> ().AddName(id4, "Escape");
//			AIState state_block = new AIState ();
//			// 中间先空着,不好说。现在的问题是,群体性行为考虑写在一个函数中,目前只有一个行为...
//
//			int id5 = mAIEntity.GetComponent<AIStrategy> ().AddStrategy (BlockActioner, BlockEnter, BlockExit, BlockFeedbacker, state_block);


            // 死亡决策
            AIState state_death = new AIState();
            state_death.Init();
            state_death.mName          = "SMdeath";
            state_death.mStateRecorder = mRecorder;
            state_death.LastEntityData.AddComponent <SMREComponent> (new SMREComponent());

            int death_die = state_death.AddExecuter(dieState, dieExit, dieEnter);

            state_death.AddStateName(death_die, "Die");

            state_death.AddAnimation(dieState, "Die");

            state_death.tempID = death_die;

            int id6 = mAIEntity.GetComponent <AIStrategy> ().AddStrategy(DeathActioner, DeathEnter, DeathExit, DeathFeedbacker, state_death);
            mAIEntity.GetComponent <AIStrategy> ().AddName(id6, "Death");

            mAIEntity.GetComponent <AIStrategy> ().SetEntry(id1);

            mAIEntity.GetComponent <shieldAI> ().mRoundCenter = gameObject.transform.position +
                                                                new Vector3(Random.Range(-roundRange, roundRange), 0,
                                                                            Random.Range(-roundRange, roundRange));

            // 组件的赋值
            GameObject rt = mAIEntity.GetComponent <BaseAIComponent> ().mAIRT;

            foreach (Transform t in rt.GetComponentsInChildren <Transform>())
            {
                if (t.name == "vs")
                {
                    mAIEntity.GetComponent <getPlayer> ().vs = t.gameObject;
                }
                else if (t.gameObject.name == "ShieldFront")
                {
                    mAIEntity.GetComponent <SSHComponent> ().shieldFObj = t.gameObject;
                }
                else if (t.gameObject.name == "ShieldBack")
                {
                    mAIEntity.GetComponent <SSHComponent> ().shieldBObj = t.gameObject;
                }
                else if (t.gameObject.name == "SwordFront")
                {
                    mAIEntity.GetComponent <SSHComponent> ().swordFObj = t.gameObject;
                }
                else if (t.gameObject.name == "SwordBack")
                {
                    mAIEntity.GetComponent <SSHComponent> ().swordBObj = t.gameObject;
                }
                else if (t.gameObject.name == "HookFront")
                {
                    mAIEntity.GetComponent <SSHComponent> ().hookFObj = t.gameObject;
                }
                else if (t.gameObject.name == "HookBack")
                {
                    mAIEntity.GetComponent <SSHComponent> ().hookBObj = t.gameObject;
                }
                else if (t.gameObject.name == "HeadC")
                {
                    mAIEntity.GetComponent <SSHComponent> ().headC = t.gameObject;
                }
            }
            mAIEntity.GetComponent <SSHComponent> ().hookThrowObj = hookThrow;

            // 为武器伤害赋值
            mAIEntity.GetComponent <SSHComponent> ().swordFObj.GetComponent <WeaponDamage> ().damage =
                mAIEntity.GetComponent <SSHComponent> ().swordDamage;
            mAIEntity.GetComponent <SSHComponent> ().hookFObj.GetComponent <WeaponDamage> ().damage =
                mAIEntity.GetComponent <SSHComponent> ().hookDamage;
            // 偶数冲锋,奇数钩子
            if (i % 2 == 0)
            {
                mAIEntity.GetComponent <SSHComponent> ().hasHook   = false;
                mAIEntity.GetComponent <SSHComponent> ().hasCharge = true;
            }
            else
            {
                mAIEntity.GetComponent <SSHComponent> ().hasHook   = true;
                mAIEntity.GetComponent <SSHComponent> ().hasCharge = false;
            }
            // 关于组行为的新加代码,在几个盾兵中,生成一个发起者
            mAIEntity.tag = "ShieldMan";
            if (i % 6 == 0)
            {
                mAIEntity.AddComponent <Group4StandardAI> (new Group4StandardAI());
                GroupManager.getInstance().AddSponsor(mAIEntity);
            }
            else
            {
                GroupManager.getInstance().AddResponse(mAIEntity);
            }

            mAIEntity.GetComponent <showAll> ().mCanvas = mCanvas;
            if (count == 1)
            {
                mAIEntity.GetComponent <showAll> ().singleTest = true;
            }
            foreach (Transform t in mCanvas.GetComponentsInChildren <Transform>())
            {
                if (t.name == "Action")
                {
                    mAIEntity.GetComponent <showAll> ().mAction = t.gameObject;
                }
                else if (t.name == "Node")
                {
                    mAIEntity.GetComponent <showAll> ().mNode = t.gameObject;
                }
                else if (t.name == "Emotion")
                {
                    mAIEntity.GetComponent <showAll> ().mEmotion = t.gameObject;
                }
                else if (t.name == "Animation")
                {
                    mAIEntity.GetComponent <showAll> ().mAnimation = t.gameObject;
                }
            }
        }
    }