示例#1
0
文件: BaseAI.cs 项目: raomuqi/vstgit
 /// <summary>
 /// 初始化AI数据
 /// </summary>
 public void InitAIData(AppearObjectData cfg)
 {
     this.cfg    = cfg.aiCfg;
     moveSpeed   = cfg.speed;
     hp          = cfg.hp;
     maxLifeTime = cfg.destroyTime;
 }
示例#2
0
    //* auto spawn ai
    void AutoSpawnAI()
    {
        int aiWaves = 20;

        levelData.appearSets = new AppearSetData[aiWaves];
        for (int p = 0; p < aiWaves; p++)
        {
            levelData.appearSets[p] = new AppearSetData();
        }                                                                                       //* must initialize each element
        levelData.activeSets = new ActiveSetData[1];
        for (int p = 0; p < 1; p++)
        {
            levelData.activeSets[p] = new ActiveSetData();
        }                                                                                   //* must initialize each element

        for (int i = 0; i < aiWaves; i++)
        {
            AppearSetData wave = levelData.appearSets[i];
            wave.time = (i + 1) * 3;
            //Debug.LogError("µÚ"+i+"²¨: "+wave.time);
            int aiCount = Random.Range(3, 5);
            wave.objectCfgs = new AppearObjectData[aiCount];
            for (int p = 0; p < aiCount; p++)
            {
                wave.objectCfgs[p] = new AppearObjectData();
            }
            for (int j = 0; j < aiCount; j++)
            {
                AppearObjectData aiCraft = wave.objectCfgs[j];
                aiCraft.objectIndex = 0;
                aiCraft.XAngle      = Random.Range(-20, 20);
                aiCraft.YAngle      = Random.Range(-5, 5);
                aiCraft.distance    = Random.Range(200, 500);
                aiCraft.hp          = 100;
                aiCraft.speed       = 1;
                aiCraft.destroyTime = 300;
                aiCraft.aiCfg       = aiStatusData;
                //* aircraft status
                //int stateCount = 3;
                //aiCraft.aiCfg.statusLoop = true;
                //aiCraft.aiCfg.statusArray = new AIState[stateCount];
                //for(int p = 0; p < stateCount; p++) { aiCraft.aiCfg.statusArray[p] = new AIState(); }

                //for (int k = 0; k < stateCount; k++)
                //{
                //    AIState state = aiCraft.aiCfg.statusArray[k];
                //    state.action = BaseAI.AIActionEnum.ToPlayer;
                //    state.fire = BaseAI.AIFireEnum.Fire;
                //    state.keepTime = -1;
                //    state.randomNext = false;
                //    state.fireKeepTime = 2 + Random.Range(0, 1);
                //    state.fireCDTime = 2 + Random.Range(0, 1);
                //}
            }
        }

        aiCreater.levelData = levelData;
    }
示例#3
0
    /// <summary>
    /// 创建场景对象
    /// </summary>
    /// <param name="objInfo"></param>
    public void CreateObject(int objectIndex, int serverID, ProtoCreateObject sync)
    {
        bool isPreSet = objectIndex >= 0;
        int  index    = isPreSet ? objectIndex : -objectIndex;

        if (index < cratePrefabs.Length)
        {
            GameObject prefab = cratePrefabs[index];
            if (prefab == null)
            {
                Debug.LogError("生成AI:无效对象索引" + objectIndex);
                return;
            }
            GameObject go = GameObject.Instantiate(prefab);
#if UNITY_EDITOR
            go.name = "" + serverID;
#endif
            if (!go.activeSelf)
            {
                go.SetActive(true);
            }
            //获取/初始化配置数据
            BaseAI ai = go.GetComponent <BaseAI>();
            if (ai != null)
            {
                if (Connection.GetInstance().isHost == true)
                {
                    AppearObjectData objCfg = AICreater.GetObjectCfg(sync.hashCode);
                    if (objCfg != null)
                    {
                        ai.InitAIData(objCfg);
                    }
                }
                sceneModel.RegisterAI(ai);
            }

            //设置同步组件
            SceneGameObject sgo = go.GetComponent <SceneGameObject>();
            if (sgo != null)
            {
                ProtoPlayerInfo selfInfo = playerModel.GetPlayerInfo();
                if (selfInfo != null)
                {
                    sgo.SetSyncStatus(objectIndex, serverID, true, selfInfo.pos, sync.GetPos(), sync.GetRot());
                    sceneModel.AddSceneObject(sgo);
                }
            }
        }
        else
        {
            Debug.LogError("生成AI:无效对象索引" + objectIndex);
        }
    }
示例#4
0
 public static void AddObjectCfg(int id, AppearObjectData data)
 {
     if (objsCfgDic == null)
     {
         return;
     }
     if (!objsCfgDic.ContainsKey(id))
     {
         objsCfgDic.Add(id, data);
     }
     else
     {
         Debug.LogError("重复id");
     }
 }
示例#5
0
    void CreateDefaultSets()
    {
        if (levelData == null)
        {
            Debug.LogError("LevelData对象为空"); return;
        }
        foreach (var item in aiStatus)
        {
            if (item == null)
            {
                Debug.LogError("AIStatusData对象为空"); return;
            }
        }

        int aiWaveCount = 40;

        levelData.appearSets = new AppearSetData[aiWaveCount];
        for (int p = 0; p < aiWaveCount; p++)
        {
            levelData.appearSets[p] = new AppearSetData();
        }                                                                                            //* must initialize each element
        levelData.activeSets = new ActiveSetData[1];
        for (int p = 0; p < 1; p++)
        {
            levelData.activeSets[p] = new ActiveSetData();
        }                                                                                   //* must initialize each element

        for (int i = 0; i < aiWaveCount; i++)
        {
            AppearSetData wave = levelData.appearSets[i];
            wave.time = (i + 1) * 5;
            //Debug.LogError("第"+i+"波: "+wave.time);
            int aiCount = Random.Range(3, 5);
            wave.objectCfgs = new AppearObjectData[aiCount];
            for (int p = 0; p < aiCount; p++)
            {
                wave.objectCfgs[p] = new AppearObjectData();
            }
            for (int j = 0; j < aiCount; j++)
            {
                AppearObjectData aiCraft = wave.objectCfgs[j];
                aiCraft.objectIndex = Random.Range(0, 3);    //* model
                aiCraft.XAngle      = Random.Range(-20, 20);
                aiCraft.YAngle      = Random.Range(-5, 5);
                aiCraft.distance    = Random.Range(200, 500);
                aiCraft.hp          = 100;
                aiCraft.speed       = 1;
                aiCraft.destroyTime = 300;
                aiCraft.aiCfg       = aiStatus[Random.Range(0, aiStatus.Length - 1)];
                //* aircraft status
                //int stateCount = 3;
                //aiCraft.aiCfg.statusLoop = true;
                //aiCraft.aiCfg.statusArray = new AIState[stateCount];
                //for(int p = 0; p < stateCount; p++) { aiCraft.aiCfg.statusArray[p] = new AIState(); }

                //for (int k = 0; k < stateCount; k++)
                //{
                //    AIState state = aiCraft.aiCfg.statusArray[k];
                //    state.action = BaseAI.AIActionEnum.ToPlayer;
                //    state.fire = BaseAI.AIFireEnum.Fire;
                //    state.keepTime = -1;
                //    state.randomNext = false;
                //    state.fireKeepTime = 2 + Random.Range(0, 1);
                //    state.fireCDTime = 2 + Random.Range(0, 1);
                //}
            }
        }

        OnLevelDataLoad();
        //Save();
    }
示例#6
0
    void DrawAppearObjectData(AppearObjectData data)
    {
        EditorGUILayout.BeginVertical();
        data.objectIndex = EditorGUILayout.IntField("对象索引:", data.objectIndex);
        EditorGUILayout.EndVertical();

        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginHorizontal();
        data.speed = EditorGUILayout.FloatField("速度:", data.speed);
        if (GUILayout.Button("随机"))
        {
            data.speed = Random.Range(speedMin, speedMax);
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();

        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginHorizontal();
        data.hp = EditorGUILayout.IntField("HP:", data.hp);
        if (GUILayout.Button("随机"))
        {
            data.hp = Random.Range(hpMin, hpMax);
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();

        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginHorizontal();
        data.distance = EditorGUILayout.FloatField("出现距离:", data.distance);
        if (GUILayout.Button("随机"))
        {
            data.distance = Random.Range(randomCreateDistanceMin, randomCreateDistanceMax);
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();

        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginHorizontal();
        data.XAngle = EditorGUILayout.FloatField("X夹角:", data.XAngle);
        if (GUILayout.Button("随机"))
        {
            data.XAngle = Random.Range(xAngleMin, xAngleMax);
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();

        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginHorizontal();
        data.YAngle = EditorGUILayout.FloatField("Y夹角:", data.YAngle);
        if (GUILayout.Button("随机"))
        {
            data.YAngle = Random.Range(yAngleMin, yAngleMax);
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();

        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginHorizontal();
        data.destroyTime = EditorGUILayout.FloatField("销毁时间:", data.destroyTime);
        if (GUILayout.Button("随机"))
        {
            data.destroyTime = Random.Range(destroyTimeMin, destroyTimeMax);
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();
        if (createListType == 0)
        {
            EditorGUILayout.BeginVertical();
            EditorGUILayout.BeginHorizontal();
            data.aiCfg = EditorGUILayout.ObjectField("AI配置", data.aiCfg, typeof(AIStatusData)) as AIStatusData;
            if (GUILayout.Button("随机"))
            {
                data.aiCfg = randomAiStatus[Random.Range(0, randomAIStatusCount)];
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.EndVertical();
        }
    }
示例#7
0
    /// <summary>
    /// 绘制创建数据
    /// </summary>
    void DrawCreateData(List <AppearSetData> list)
    {
        if (curCreateData == null)
        {
            if (list.Count > 0)
            {
                dataTitle     = "第0波";
                curCreateData = list[0];
            }
            else
            {
                EditorGUILayout.LabelField("必须先编辑列表");
            }
        }
        else
        {
            dataPos = EditorGUILayout.BeginScrollView(dataPos);
            EditorGUILayout.BeginVertical();
            curCreateData.time = EditorGUILayout.FloatField("时间点:", curCreateData.time);
            EditorGUILayout.EndVertical();
            EditorGUILayout.Space(20);

            EditorGUILayout.BeginVertical();
            randomObjectCount = EditorGUILayout.IntField("随机对象数组大小:", randomObjectCount);
            if (randomObjectCount < 1)
            {
                randomObjectCount = 1;
            }
            EditorGUILayout.EndVertical();
            //随机对象索引列表UI
            if (randomObjectIndexs == null)
            {
                randomObjectIndexs = new int[randomObjectCount];
            }
            else
            {
                if (randomObjectIndexs.Length != randomObjectCount)
                {
                    int[] temp = randomObjectIndexs;
                    randomObjectIndexs = new int[randomObjectCount];
                    for (int i = 0; i < randomObjectCount; i++)
                    {
                        if (temp.Length - 1 < i)
                        {
                            break;
                        }
                        randomObjectIndexs[i] = temp[i];
                    }
                }
            }
            for (int i = 0; i < randomObjectCount; i++)
            {
                EditorGUILayout.BeginVertical();
                randomObjectIndexs[i] = EditorGUILayout.IntField("随机对象Index:", randomObjectIndexs[i]);
                EditorGUILayout.EndVertical();
            }
            EditorGUILayout.Space(20);
            //随机数量UI
            EditorGUILayout.BeginHorizontal();
            createCountRangeMin = EditorGUILayout.IntField("随机数量最小值:", createCountRangeMin);
            if (createCountRangeMin < 1)
            {
                createCountRangeMin = 1;
            }
            createCountRangeMax = EditorGUILayout.IntField("随机数量最大值:", createCountRangeMax);
            EditorGUILayout.EndHorizontal();
            //随机距离UI
            EditorGUILayout.BeginHorizontal();
            randomCreateDistanceMin = EditorGUILayout.FloatField("随机距离最小值:", randomCreateDistanceMin);
            randomCreateDistanceMax = EditorGUILayout.FloatField("随机距离最大值:", randomCreateDistanceMax);
            EditorGUILayout.EndHorizontal();
            //随机XY角度UI
            EditorGUILayout.BeginHorizontal();
            xAngleMin = EditorGUILayout.FloatField("随机x夹角最小:", xAngleMin);
            xAngleMax = EditorGUILayout.FloatField("随机x夹角最大:", xAngleMax);
            yAngleMin = EditorGUILayout.FloatField("随机y夹角最小:", yAngleMin);
            yAngleMax = EditorGUILayout.FloatField("随机y夹角最大:", yAngleMax);
            EditorGUILayout.EndHorizontal();
            //随机属性UI
            EditorGUILayout.BeginHorizontal();
            hpMin    = EditorGUILayout.IntField("随机hp最小值:", hpMin);
            hpMax    = EditorGUILayout.IntField("随机hp最大值:", hpMax);
            speedMin = EditorGUILayout.FloatField("随机速度最小:", speedMin);
            speedMax = EditorGUILayout.FloatField("随机速度最大:", speedMax);
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.BeginHorizontal();
            destroyTimeMin = EditorGUILayout.FloatField("随机销毁时间最小:", destroyTimeMin);
            destroyTimeMax = EditorGUILayout.FloatField("随机销毁时间最大:", destroyTimeMax);
            EditorGUILayout.EndHorizontal();
            //AI
            if (createListType == 0)
            {
                //随机AI配置UI
                EditorGUILayout.Space(20);
                randomAIStatusCount = EditorGUILayout.IntField("随机AI配置(>0):", randomAIStatusCount);
                randomAIStatusCount = randomAIStatusCount <= 0 ? 1 : randomAIStatusCount;
                if (randomAiStatus == null)
                {
                    randomAiStatus = new AIStatusData[randomAIStatusCount];
                    openStatus     = new byte[randomAIStatusCount];
                }
                else
                {
                    if (randomAiStatus.Length != randomAIStatusCount)
                    {
                        AIStatusData[] temp = randomAiStatus;
                        randomAiStatus = new AIStatusData[randomAIStatusCount];
                        openStatus     = new byte[randomAIStatusCount];
                        for (int i = 0; i < randomAIStatusCount; i++)
                        {
                            if (temp.Length - 1 < i)
                            {
                                break;
                            }
                            randomAiStatus[i] = temp[i];
                        }
                    }
                }
                for (int i = 0; i < randomAIStatusCount; i++)
                {
                    EditorGUILayout.BeginVertical();
                    randomAiStatus[i] = EditorGUILayout.ObjectField(randomAiStatus[i], typeof(AIStatusData)) as AIStatusData;
                    EditorGUILayout.EndVertical();
                }
                EditorGUILayout.Space(20);
            }
            //生成随机数据
            if (GUILayout.Button("随机数量(会重置所有Item)"))
            {
                if (createListType == 0 && randomAiStatus[0] == null)
                {
                    EditorUtility.DisplayDialog("提示", "没放入AI配置", "OK");
                }
                else
                {
                    int count = Random.Range(createCountRangeMin, createCountRangeMax);
                    curCreateData.objectCfgs = new AppearObjectData[count];
                    for (int i = 0; i < count; i++)
                    {
                        var temp = new AppearObjectData();
                        temp.objectIndex = randomObjectIndexs[Random.Range(0, randomObjectCount)];;
                        temp.speed       = Random.Range(speedMin, speedMax);
                        temp.hp          = Random.Range(hpMin, hpMax);
                        temp.distance    = Random.Range(randomCreateDistanceMin, randomCreateDistanceMax);
                        temp.XAngle      = Random.Range(xAngleMin, xAngleMax);
                        temp.YAngle      = Random.Range(yAngleMin, yAngleMax);
                        temp.destroyTime = Random.Range(destroyTimeMin, destroyTimeMax);
                        if (createListType == 0)
                        {
                            temp.aiCfg = randomAiStatus[Random.Range(0, randomAIStatusCount)];
                        }
                        curCreateData.objectCfgs[i] = temp;
                    }
                }
            }
            if (curCreateData.objectCfgs != null && curCreateData.objectCfgs.Length > 0)
            {
                if (openStatus == null || openStatus.Length != curCreateData.objectCfgs.Length)
                {
                    openStatus = new byte[curCreateData.objectCfgs.Length];
                }
                EditorGUILayout.Space();
                EditorGUILayout.LabelField("Item:");
                for (int i = 0; i < curCreateData.objectCfgs.Length; i++)
                {
                    EditorGUILayout.BeginVertical();
                    if (GUILayout.Button("对象:" + i.ToString()))
                    {
                        if (openStatus[i] == 0)
                        {
                            openStatus[i] = 1;
                        }
                        else
                        {
                            openStatus[i] = 0;
                        }
                    }
                    if (openStatus[i] == 1)
                    {
                        DrawAppearObjectData(curCreateData.objectCfgs[i]);
                    }
                    EditorGUILayout.EndVertical();
                }
            }
            EditorGUILayout.Space();
            EditorGUILayout.EndScrollView();
        }
    }