コード例 #1
0
ファイル: MonsterManager.cs プロジェクト: 737871854/FireMen
    public Monster CreateMonster(int id, Vector3 position, Vector3 dir, int dataId)
    {
        MonsterPO po = MonsterData.Instance.GetMonsterPO(dataId);

        if (po == null)
        {
            return(null);
        }

        Monster prefab = GetPrefab(po.ShapeName);

        if (prefab == null)
        {
            return(null);
        }

        Monster go = GameObject.Instantiate(prefab, position, Quaternion.AngleAxis(180, Vector3.up)) as Monster;

        go.Init(id, po);
        go.name = go.name + "_" + id;
        return(go);
    }
コード例 #2
0
    public void Init(int id, MonsterPO dataPO)
    {
        // 基础数据
        this.twHit            = null;
        this.twHitInterval    = 0.0f;
        this.moveType         = (MoveType)dataPO.MoveType;
        this.destroy          = false;
        this.fixedTargetIndex = 0;
        this.idleTimer        = dataPO.MoveCool;
        this.skillTimer       = dataPO.AttackCool;
        this.disappearTimer   = (float)dataPO.DisappearTime / 1000.0f;
        this.disappearAlpha   = false;
        this.id             = id;
        this.state          = StateType.Idle;
        this.dataPO         = dataPO;
        this.hp             = dataPO.Hp;
        this.mp             = 0;
        this.score          = 0;
        this.goHead         = transform.Find("Head").gameObject;
        this.lockRescued    = false;
        this.damageWater    = false;
        this.tipsCount      = 0;
        this.randRotateTime = 3.0f;
        this.lastPlayer     = null;
        // 固定点移动配置
        if (dataPO.FixPoint.Length % 3 == 0)
        {
            fixedTargetPosition = new Vector3[dataPO.FixPoint.Length / 3];
            for (int index = 0, count = 0; index < dataPO.FixPoint.Length; ++count)
            {
                Vector3 pos = new Vector3(dataPO.FixPoint[index++], dataPO.FixPoint[index++], dataPO.FixPoint[index++]);
                fixedTargetPosition[count] = pos;
            }
        }

        // 随机移动距离
        if (dataPO.MoveDistance.Length % 2 == 0)
        {
            canMoveDistance     = new MoveDistance();
            canMoveDistance.min = dataPO.MoveDistance[0];
            canMoveDistance.max = dataPO.MoveDistance[1];
        }

        //// 动画系统
        animator = GetComponent <Animator>();
        //// 移动系统
        //if (moveType == MoveType.Walk)
        //{
        //    mvAgent = GetComponent<NavMeshAgent>();
        //    mvAgent.speed = MoveSpeed;
        //    mvAgent.SetDestination(transform.position);
        //}
        //else
        //{
        //    GetComponent<NavMeshAgent>().enabled = false;
        //}

        // 技能与Buffer系统
        skillComponent  = gameObject.AddComponent <SkillComponent>();
        bufferComponent = gameObject.AddComponent <BufferComponent>();
        List <int> skillList = new List <int>();

        skillList.Add(dataPO.SkillID1);
        skillList.Add(dataPO.SkillID2);
        skillList.Add(dataPO.SkillID3);
        skillComponent.Init(skillList);
        bufferComponent.Init();

        // 特效数据
        AddBornEffect();

        // 添加头顶UI
        AppendHeadUI();

        // 武器图标
        AppendWeaponUI();

        // 救援图标
        AppendRescueHintUI();

        // 暂时特殊处理(BOSS 朝向镜头)
        //if ((MonsterType)dataPO.MonsterType == MonsterType.Boss)
        //{
        FaceTo(Camera.main.transform.position, 0.0f);
        //}

        // Hitting Act
        hittingPartDic = new Dictionary <string, HittingPart>();
        bulletTime     = 0.0f;
        invincible     = false;

        // 刷新音效
        if (dataPO.BirthSound.Length == 2)
        {
            string sound   = dataPO.BirthSound[0];
            int    percent = dataPO.BirthSound[1].ToInt();
            int    seed    = Random.Range(1, 10000);
            if (seed > percent)
            {
                return;
            }

            Main.SoundController.FireEvent(sound);
        }
    }
コード例 #3
0
    /// <summary>
    /// 怪物刷新
    /// </summary>
    void OnRefresh()
    {
        while (true)
        {
            int refreshId;
            if ((int)sceneId != 3)
            {
                refreshId = ((int)sceneId * 10000000) + 10000 + refreshIndex;
            }
            else
            {
                refreshId = ((int)sceneId * 10000000) + (GameConfig.GAME_CONFIG_DIFFICULTY * 10001) + refreshIndex - 1;
            }

            MonsterRefreshPO refreshPO = MonsterRefreshData.Instance.GetMonsterRefreshPO(refreshId);
            if (refreshPO == null)
            {
                return;
            }

            MonsterPO monsterPO = MonsterData.Instance.GetMonsterPO(refreshPO.MonsterId);
            if (monsterPO == null)
            {
                return;
            }

            if (Main.GameMode.CheckPoint < refreshPO.CheckPoint)
            {
                return;
            }

            if (Main.GameMode.CheckPoint > refreshPO.CheckPoint)
            {
                ++refreshIndex;
                continue;
            }

            // 判断时间
            float refreshTime = (float)refreshPO.AppeareTime / 1000.0f;
            if (refreshTime > Main.GameMode.GameTime)
            {
                return;
            }

            // 针对有限数量的刷新
            if (refreshPO.MonsterNumber > 0)
            {
                for (int index = 0; index < refreshPO.MonsterNumber; ++index)
                {
                    // 马上刷出
                    if (refreshPO.SeparateTime == 0)
                    {
                        if (monsterPO.FireCarId > 0 && !Main.PlayerManager.getPlayer(monsterPO.FireCarId - 1).IsPlaying())
                        {
                            return;
                        }

                        if (refreshPO.WindowName.Length > 0 && !DoorManager.instance.OpenDoor(refreshPO.WindowName))
                        {
                            return;
                        }
                        Monster go = CreateMonster(refreshPO);
                        CarManager.instance.Help(go.CarId, go);
                    }
                    // 延迟刷出
                    else
                    {
                        DelayRefresh delay = new DelayRefresh();
                        delay.refreshId   = refreshId;
                        delay.refreshTime = Main.GameMode.GameTime + ((float)refreshPO.SeparateTime / 1000.0f) * index;
                        //delayRefreshDict.Add(delayId++, delay);
                        delayRefreshDict.Add(delay);
                    }
                }
            }
            // 如果要循环刷新,这两个值必须有规定
            else if (refreshPO.MonsterNumber == -1 && refreshPO.SeparateTime > 0)
            {
                bool createFlag = true;
                if (monsterPO.FireCarId > 0 && !Main.PlayerManager.getPlayer(monsterPO.FireCarId - 1).IsPlaying())
                {
                    createFlag = false;
                }

                if (createFlag)
                {
                    if (refreshPO.WindowName.Length > 0 && !DoorManager.instance.OpenDoor(refreshPO.WindowName))
                    {
                        return;
                    }

                    Monster go = CreateMonster(refreshPO);
                    CarManager.instance.Help(go.CarId, go);
                }

                DelayRefresh delay = new DelayRefresh();
                delay.refreshId   = refreshId;
                delay.refreshTime = Main.GameMode.GameTime + ((float)refreshPO.SeparateTime / 1000.0f);
                //delayRefreshDict.Add(delayId++, delay);
                delayRefreshDict.Add(delay);
            }

            ++refreshIndex;
        }
    }
コード例 #4
0
    /// <summary>
    /// 怪物延迟刷新
    /// </summary>
    void OnDelayRefresh()
    {
        // 按照策划的要求,延迟队列必须是每次全部执行,保证所有怪物的刷新时间能够得到有效的判断
        //List<int> deleteList = new List<int>();
        //foreach(KeyValuePair<int, DelayRefresh> element in delayRefreshDict)
        for (int index = 0; index < delayRefreshDict.Count; ++index)
        {
            DelayRefresh     element   = delayRefreshDict[index];
            MonsterRefreshPO refreshPO = MonsterRefreshData.Instance.GetMonsterRefreshPO(element.refreshId);
            if (refreshPO == null)
            {
                continue;
            }

            MonsterPO monsterPO = MonsterData.Instance.GetMonsterPO(refreshPO.MonsterId);
            if (monsterPO == null)
            {
                return;
            }

            if (Main.GameMode.CheckPoint != refreshPO.CheckPoint)
            {
                //deleteList.Add(element.Key);
                delayRefreshDict.RemoveAt(index);
                return;
            }

            if (element.refreshTime >= Main.GameMode.GameTime)
            {
                continue;
            }

            bool createFlag = true;
            if (monsterPO.FireCarId > 0 && !Main.PlayerManager.getPlayer(monsterPO.FireCarId - 1).IsPlaying())
            {
                createFlag = false;
            }

            if (createFlag)
            {
                if (refreshPO.WindowName.Length > 0 && !DoorManager.instance.OpenDoor(refreshPO.WindowName))
                {
                    continue;
                }

                Monster go = CreateMonster(refreshPO);
                CarManager.instance.Help(go.CarId, go);
            }

            if (refreshPO.MonsterNumber == -1)
            {
                element.refreshTime     = Main.GameMode.GameTime + ((float)refreshPO.SeparateTime / 1000.0f);
                delayRefreshDict[index] = element;
                continue;
            }

            //deleteList.Add(element.Key);
            delayRefreshDict.RemoveAt(index);
            return;
        }

        //for (int index = 0; index < deleteList.Count; ++index)
        //{
        //    delayRefreshDict.Remove(deleteList[index]);
        //}
    }