/// <summary> /// 初始化AI数据 /// </summary> public void InitAIData(AppearObjectData cfg) { this.cfg = cfg.aiCfg; moveSpeed = cfg.speed; hp = cfg.hp; maxLifeTime = cfg.destroyTime; }
//* 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; }
/// <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); } }
public static void AddObjectCfg(int id, AppearObjectData data) { if (objsCfgDic == null) { return; } if (!objsCfgDic.ContainsKey(id)) { objsCfgDic.Add(id, data); } else { Debug.LogError("重复id"); } }
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(); }
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(); } }
/// <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(); } }