IEnumerator _Coro_CenterFishGenerateAndMove(int circleIdx) { float elapse = 0F; float rotateSpeed = 6.283185F / OneCircleTime;//弧度/s float useTime = OneCircleTime * mRunRound + CenterFishRunoutTime[circleIdx]; Fish fishCenter = Instantiate(Prefabs_FishCenter[circleIdx]) as Fish; Swimmer centerSwimmer = fishCenter.swimmer; fishCenter.ClearAI(); fishCenter.transform.parent = transform; fishCenter.transform.localPosition = new Vector3(Locals_Center[circleIdx].x, Locals_Center[circleIdx].y, Locals_Center[circleIdx].z - 0.1F); fishCenter.transform.localRotation = Quaternion.identity; centerSwimmer.RotateSpd = 6.283185F; while (elapse < useTime) { if (centerSwimmer == null || fishCenter == null || !fishCenter.Attackable)//暂时用attackable来确定鱼死亡 { break; } //中间鱼转动 centerSwimmer.transform.localRotation = Quaternion.AxisAngle(Vector3.forward, centerSwimmer.RotateSpd); centerSwimmer.RotateSpd -= rotateSpeed * Time.deltaTime; elapse += Time.deltaTime; yield return(0); } if (centerSwimmer != null) { centerSwimmer.Speed = FishRunoutSpeed * 0.7F; centerSwimmer.Go(); } }
void Handle_FreezeBombDeactive() { if (GameMain.State_ == GameMain.State.Normal) { mGm.FishGenerator.StartFishGenerate(); } //??????? //??????????? foreach (Fish prefabFish in mGm.FishGenerator.Prefab_FishAll) { int typeIdx = prefabFish.TypeIndex; Dictionary <int, Fish> fishTypeDict = mGm.FishGenerator.FishTypeIndexMap[typeIdx]; if (fishTypeDict == null) { continue; } foreach (KeyValuePair <int, Fish> kvp in fishTypeDict) { Fish fInScene = kvp.Value; if (fInScene != null && fInScene.Attackable) { IFishAI aiFish = fInScene.GetComponent($"IFishAI") as IFishAI; if (aiFish != null) { aiFish.Resume(); } Swimmer swm = fInScene.GetComponent <Swimmer>(); if (swm != null) { swm.Go(); } } } } foreach (KeyValuePair <int, Swimmer> kvpLeader in mGm.FishGenerator.LeadersAll) { kvpLeader.Value.Go(); } }
//public public IEnumerator _Coro_Process() { //辣椒鱼往中间走 var oneSideNum = 160; var fishUpDown = new Fish[2, oneSideNum]; StartCoroutine(_Coro_GenerateRoadSideFish(fishUpDown, oneSideNum)); Vector3[] posLineFish = new Vector3[2] { TsLineFish[0].position, TsLineFish[1].position }; posLineFish[0].x -= GameMain.Singleton.WorldDimension.width * 0.5F; posLineFish[1].x += GameMain.Singleton.WorldDimension.width * 0.5F; for (int i = 0; i != 2; ++i) { TsLineFish[i].position = posLineFish[i]; } Transform ts; while (true) { int nullNum = 0; for (int i = 0; i != TsLineFish.Length; ++i) { if (TsLineFish[i] == null) { ++nullNum; continue; } ts = TsLineFish[i]; ts.position += ts.right * Speed * Time.deltaTime; if ((ts.right.x > 0F && ts.position.x > GameMain.Singleton.WorldDimension.xMax) ||//向左并达到左边屏幕边 (ts.right.x <= 0F && ts.position.x < GameMain.Singleton.WorldDimension.x)) //向右移动并达到右边屏幕边 { List <Fish> fishToClear = new List <Fish>(); foreach (Transform tChild in TsLineFish[i]) { Fish f = tChild.GetComponent <Fish>(); if (f != null && f.Attackable) { fishToClear.Add(f); } } foreach (Fish f in fishToClear) { f.Clear(); } Destroy(TsLineFish[i].gameObject); TsLineFish[i] = null; } } if (nullNum == TsLineFish.Length) { break; } yield return(0); } //两边路散走 ////设置碰撞框 //float fishSpeedHalf = Prefab_FishCompositeRoad.swimmer.Speed * 0.5F; Swimmer swimmerTmp = null; for (int i = 0; i != 2; ++i) { for (int j = 0; j != oneSideNum; ++j) { if (fishUpDown[i, j] == null) { continue; } swimmerTmp = fishUpDown[i, j].swimmer; swimmerTmp.SetLiveDimension(Defines.ClearFishRadius); swimmerTmp.Speed = Random.Range(swimmerTmp.Speed * 0.9F, swimmerTmp.Speed * 1.5F); swimmerTmp.Go(); } } //等待清鱼,改用时间限制 while (GameMain.Singleton.NumFishAlive != 0) { yield return(0); } EndPrelude(); }
IEnumerator _Coro_Generate() { int num = Random.Range(NumMin, NumMax + 1); int generatedNum = 0; yield return(0);//为取得transform.localPosition //生成leaderFish GameObject goLeader = new GameObject("领队_" + Prefab_Fish.name); Swimmer fishLeader = goLeader.AddComponent <Swimmer>(); goLeader.AddComponent <DestroyWhenSwimmerOut>(); if (GameMain.EvtLeaderInstance != null) { GameMain.EvtLeaderInstance(fishLeader); } //fishLeader.Attackable = false; Prefab_Fish.swimmer.CopyDataTo(fishLeader); fishLeader.SetLiveDimension(Defines.ClearFishRadius);//swim to fix fishLeader.RotateSpd = Fish_RotateSpd; fishLeader.Speed = Fish_Speed; FishAI_FreeSwimSingle fishAILeader = goLeader.AddComponent <FishAI_FreeSwimSingle>(); Prefab_Fish.GetComponent <FishAI_FreeSwimSingle>().CopyDataTo(fishAILeader); fishAILeader.enabled = false; fishAILeader.RotateAngleRndRange = Fish_RotateAngleRndRange; fishAILeader.RotateInterval = Fish_RotateInterval; fishAILeader.RotateIntervalRndRange = Fish_RotateIntervalRndRange; fishLeader.transform.parent = GameMain.Singleton.FishGenerator.transform; Vector3 localPos = transform.localPosition; localPos.z = Defines.GMDepth_Fish + GameMain.Singleton.FishGenerator.ApplyFishDepth(); fishLeader.transform.localPosition = localPos; fishLeader.transform.localRotation = transform.localRotation; fishLeader.Go(); Fish preFish = null; float distanceToLeader = 0F; while (generatedNum < num) { yield return(new WaitForSeconds((Distance + fishLeader.BoundCircleRadius * 2F) / fishLeader.Speed)); if (fishLeader == null) { break; } Fish f = Instantiate(Prefab_Fish) as Fish; Swimmer s = f.swimmer; f.name = Prefab_Fish.name; s.RotateSpd = Fish_RotateSpd; s.Speed = Fish_Speed; //动画设置 if (preFish != null) { //f.AniSprite.clipTime = preFish.AniSprite.clipTime; //f.AniSprite.Play(preFish.AniSprite.ClipTimeSeconds); f.AniSprite.PlayFrom(f.AniSprite.DefaultClip, preFish.AniSprite.ClipTimeSeconds); } //删除所有其他ai f.ClearAI(); FishAI_Follow aiFollow = f.gameObject.AddComponent <FishAI_Follow>(); aiFollow.SetTarget(fishLeader); distanceToLeader += (Distance + fishLeader.BoundCircleRadius * 2F); aiFollow.DistanceToLeader = distanceToLeader; //方位设置 f.transform.parent = GameMain.Singleton.FishGenerator.transform; localPos = transform.localPosition; localPos.z = Defines.GMDepth_Fish + GameMain.Singleton.FishGenerator.ApplyFishDepth(); f.transform.localPosition = localPos; f.transform.localRotation = transform.localRotation; s.Go(); ++generatedNum; preFish = f; } yield return(0); if (fishAILeader != null) { fishAILeader.enabled = true; } Destroy(gameObject); }
public int NumMin = 4; //最少生成个数 //void Awake() //{ // //if (GameMain.EvtStopGenerateFish != null) // // Debug.Log("s GameMain.EvtStopGenerateFish.length = " + GameMain.EvtStopGenerateFish.GetInvocationList().Length); // GameMain.EvtStopGenerateFish += Handle_StopGenerateFish; //} //void OnDestroy() //{ // //Debug.Log("destroy"); // if(GameMain.EvtStopGenerateFish != null) // Debug.Log("GameMain.EvtStopGenerateFish.length = " + GameMain.EvtStopGenerateFish.GetInvocationList().Length); //} //void Handle_StopGenerateFish() //{ // //StopCoroutine("_Coro_Generate"); // //GameMain.EvtStopGenerateFish -= Handle_StopGenerateFish; // //Destroy(gameObject); //} //public void Generate() //{ // StartCoroutine("_Coro_Generate"); //} public void Generate() { int num = Random.Range(NumMin, NumMax + 1); int generatedNum = 0; //yield return 0;//为取得transform.localPosition Swimmer leader = null; //Swimmer[] allSwimmer = new Swimmer[num]; while (generatedNum < num) { Swimmer s = null; if (generatedNum == 0) { GameObject goLeader = new GameObject("领队_" + Prefab_Fish.name); leader = goLeader.AddComponent <Swimmer>(); s = leader; if (GameMain.EvtLeaderInstance != null) { GameMain.EvtLeaderInstance(leader); } goLeader.AddComponent <DestroyWhenSwimmerOut>(); Prefab_Fish.swimmer.CopyDataTo(leader); } else { Fish f = Instantiate(Prefab_Fish) as Fish; s = f.swimmer; f.name = Prefab_Fish.name; //删除所有其他ai f.ClearAI(); FishAI_Flock aiFollow = f.gameObject.AddComponent <FishAI_Flock>(); aiFollow.SetLeader(leader); } s.gameObject.AddComponent <FishDimenSetWhenEnterWorld>(); //allSwimmer[generatedNum] = s; s.SetLiveDimension(Radius / s.BoundCircleRadius * 2F); Transform tsSwimmer = s.transform; tsSwimmer.parent = GameMain.Singleton.FishGenerator.transform; Vector3 localPos = Random.insideUnitCircle * (Radius - s.BoundCircleRadius); localPos = transform.localPosition + localPos; localPos.z = Defines.GMDepth_Fish + GameMain.Singleton.FishGenerator.ApplyFishDepth(); tsSwimmer.localPosition = localPos; tsSwimmer.localRotation = transform.localRotation /* * Quaternion.AngleAxis(Random.Range(-AngleRndInit,AngleRndInit),Vector3.forward)*/; //f.transform.right = Vector3.zero - transform.localPosition; s.Go(); ++generatedNum; //yield return 0;//不连续创建 } //int fishLiveDimSetted = 0; //while (fishLiveDimSetted < num) //{ // for (int i = 0; i != num;++i ) // { // if (allSwimmer[i] != null && allSwimmer[i].IsInWorld()) // { // allSwimmer[i].SetLiveDimension(Defines.ClearFishRadius); // allSwimmer[i] = null; // ++fishLiveDimSetted; // } // } // yield return new WaitForSeconds(0.3F); //} //GameMain.EvtStopGenerateFish -= Handle_StopGenerateFish; Destroy(gameObject); }