void OnTriggerEnter(Collider collider) { if (collider.gameObject.tag == "Enemy") { /*物体の検知時、物体の範囲測定、各disListの作成*/ float[,] enemyArea = EnemyArea(collider.gameObject.transform.position.x, collider.gameObject.transform.position.y, 2f, 0.3f); float[] JUMPdisList = new float[JUMP.Count]; int i = 0; foreach (ActPosition2 a in JUMP) { JUMPdisList[i] = a.AreaChecker(enemyArea); i++; } float[] SLIDEdisList = new float[SLIDE.Count]; i = 0; foreach (ActPosition2 a in SLIDE) { SLIDEdisList[i] = a.AreaChecker(enemyArea); i++; } /*物体のスピードを参照し、disList、物体が来るまでのフレーム、検知した時のフレームをobjectListへ*/ Demo2enemy enemy = collider.gameObject.GetComponent <Demo2enemy>(); int enemyFrame = (int)((collider.gameObject.transform.position.z - 0.15f - this.gameObject.transform.position.z) / enemy.speed); ComeObject obj = new ComeObject(JUMPdisList, SLIDEdisList, enemyFrame, frameCount); objectList.Add(obj); /*TimeLineを参照しScheduleがあるかないかによりわける*/ if (TimeLine.Count == 0) { Scheduling(objectList[objectList.Count - 1]); } else { ReScheduling(objectList[objectList.Count - 1], collider); } } }
/*Scheduleがあるとき、すでに入っているScheduleと比較して処理*/ void ReScheduling(ComeObject obj, Collider collider) { Schedule start = obj.ActTiming(JUMP, SLIDE, frameCount); if (start.GetStart() > TimeLine[TimeLine.Count - 1].GetEnd()) { /*すでに入っているScheduleと干渉しないとき、そのままScheduleを送る*/ TimeLine.Add(start); } else { /*すでに入っているScheduleと干渉するとき*/ Debug.Log("matchng"); int timingDis = obj.GetFrame() - objectList[objectList.Count - 2].GetFrame(); /*一気に跳べるかの判断、とべると判断したときはdisListをチェックしながらタイミング検索、ここで出なかったら次へ*/ if (obj.JUMPTime() >= timingDis && objectList[objectList.Count - 2].JUMPTime() >= timingDis) { Debug.Log("ALLJUMP"); int AllJUMPframe = 0; for (int i = 0; i < JUMP.Count - timingDis / 2; i++) { if (objectList[objectList.Count - 2].GetDis("JUMP", i) > 0 && obj.GetDis("JUMP", i + timingDis / 2) > 0) { AllJUMPframe = i * 2; break; } } if (AllJUMPframe != 0) { TimeLine[TimeLine.Count - 1].ReSet("JUMP", objectList[objectList.Count - 2].GetFrame() - AllJUMPframe); return; } } /*一気にスライディングできるかの判断、できると判断したときはdisListをチェックしながらタイミング検索、ここで出なかったら次へ*/ if (obj.SLIDETime() >= timingDis && objectList[objectList.Count - 2].SLIDETime() >= timingDis) { Debug.Log("AllSlide"); int AllSLIDEframe = 0; for (int i = 0; i < SLIDE.Count - timingDis / 2; i++) { if (objectList[objectList.Count - 2].GetDis("SLIDE", i) > 0 && obj.GetDis("SLIDE", i + timingDis / 2) > 0) { AllSLIDEframe = i * 2; break; } } if (AllSLIDEframe != 0) { TimeLine[TimeLine.Count - 1].ReSet("SLIDE", objectList[objectList.Count - 2].GetFrame() - AllSLIDEframe); return; } } /*タイミング調整、二個目のオブジェクトの到着フレームと回避開始フレーム、一個目のオブジェクトの到着フレームと回避終了フレームの比較*/ int t = -1; for (int i = 0; i < TimeLine[TimeLine.Count - 1].GetStart() - frameCount; i++) { if (obj.GetFrame() > TimeLine[TimeLine.Count - 1].GetEnd() + obj.GetDisStart(start.GetAction()) - i && objectList[objectList.Count - 2].GetFrame() <= TimeLine[TimeLine.Count - 1].GetStart() + objectList[objectList.Count - 2].GetDisEnd(TimeLine[TimeLine.Count - 1].GetAction()) - i) { Debug.Log("成功"); t = i; break; } } if (t >= 0) { Debug.Log("TimingTune:" + t); TimeLine[TimeLine.Count - 1].ReSetTiming(TimeLine[TimeLine.Count - 1].GetStart() - t); start.ReSetTiming(TimeLine[TimeLine.Count - 1].GetEnd() - t); TimeLine.Add(start); return; } /*前に行う動作を変更してタイミング調整を行う*/ if (TimeLine[TimeLine.Count - 1].GetAction() == "JUMP" && objectList[objectList.Count - 2].SLIDETime() > 0) { Debug.Log("BeforeReTune"); Schedule reTime = new Schedule(start.GetStart() - 40, 40, "SLIDE"); for (int i = 0; i < reTime.GetStart() - frameCount; i++) { if (obj.GetFrame() > reTime.GetEnd() + obj.GetDisStart(start.GetAction()) - i && objectList[objectList.Count - 2].GetFrame() <= reTime.GetStart() + objectList[objectList.Count - 2].GetDisEnd(reTime.GetAction()) - i) { Debug.Log("成功"); t = i; break; } } if (t >= 0) { Debug.Log("TimingBeforeReTune:" + t); reTime.ReSetTiming(reTime.GetStart() - t); start.ReSetTiming(reTime.GetEnd() - t); TimeLine.RemoveAt(TimeLine.Count - 1); TimeLine.Add(reTime); TimeLine.Add(start); return; } } else if (start.GetAction() == "SLIDE" && obj.JUMPTime() > 0) { Debug.Log("BeforeReTune"); Schedule reTime = new Schedule(start.GetStart() - 56, 56, "JUMP"); for (int i = 0; i < reTime.GetStart() - frameCount; i++) { if (obj.GetFrame() > reTime.GetEnd() + obj.GetDisStart(start.GetAction()) - i && objectList[objectList.Count - 2].GetFrame() <= reTime.GetStart() + objectList[objectList.Count - 2].GetDisEnd(reTime.GetAction()) - i) { Debug.Log("成功"); t = i; break; } } if (t >= 0) { Debug.Log("TimingBeforeReTune:" + t); reTime.ReSetTiming(reTime.GetStart() - t); start.ReSetTiming(reTime.GetEnd() - t); TimeLine.RemoveAt(TimeLine.Count - 1); TimeLine.Add(reTime); TimeLine.Add(start); return; } } /*後に行う動作を変更してタイミング調整を行う*/ if (start.GetAction() == "JUMP" && obj.SLIDETime() > 0) { Debug.Log("AfterReTune:"); start.ReSet("SLIDE", TimeLine[TimeLine.Count - 1].GetEnd()); for (int i = 0; i < TimeLine[TimeLine.Count - 1].GetStart() - frameCount; i++) { if (obj.GetFrame() > TimeLine[TimeLine.Count - 1].GetEnd() + obj.GetDisStart(start.GetAction()) - i && objectList[objectList.Count - 2].GetFrame() <= TimeLine[TimeLine.Count - 1].GetStart() + objectList[objectList.Count - 2].GetDisEnd(TimeLine[TimeLine.Count - 1].GetAction()) - i) { Debug.Log("成功"); t = i; break; } } if (t >= 0) { Debug.Log("TimingAfterReTune:" + t); TimeLine[TimeLine.Count - 1].ReSetTiming(TimeLine[TimeLine.Count - 1].GetStart() - t); start.ReSetTiming(TimeLine[TimeLine.Count - 1].GetEnd() - t); TimeLine.Add(start); return; } } else if (start.GetAction() == "SLIDE" && obj.JUMPTime() > 0) { Debug.Log("AfterReTune:"); start.ReSet("JUMP", TimeLine[TimeLine.Count - 1].GetEnd()); for (int i = 0; i < TimeLine[TimeLine.Count - 1].GetStart() - frameCount; i++) { if (obj.GetFrame() > TimeLine[TimeLine.Count - 1].GetEnd() + obj.GetDisStart(start.GetAction()) - i && objectList[objectList.Count - 2].GetFrame() <= TimeLine[TimeLine.Count - 1].GetStart() + objectList[objectList.Count - 2].GetDisEnd(TimeLine[TimeLine.Count - 1].GetAction()) - i) { Debug.Log("成功"); t = i; break; } } if (t >= 0) { Debug.Log("TimingAfterReTune:" + t); TimeLine[TimeLine.Count - 1].ReSetTiming(TimeLine[TimeLine.Count - 1].GetStart() - t); start.ReSetTiming(TimeLine[TimeLine.Count - 1].GetEnd() - t); TimeLine.Add(start); return; } } /*前と後に行う動作を変更してタイミング調整を行う*/ if (TimeLine[TimeLine.Count - 1].GetAction() == "JUMP" && objectList[objectList.Count - 2].SLIDETime() > 0) { Debug.Log("BeforeAfterReTune"); Schedule reTime = new Schedule(start.GetStart() - 40, 40, "SLIDE"); for (int i = 0; i < reTime.GetStart() - frameCount; i++) { if (obj.GetFrame() > reTime.GetEnd() + obj.GetDisStart(start.GetAction()) - i && objectList[objectList.Count - 2].GetFrame() <= reTime.GetStart() + objectList[objectList.Count - 2].GetDisEnd(reTime.GetAction()) - i) { Debug.Log("成功"); t = i; break; } } if (t >= 0) { Debug.Log("TimingBeforeAfterReTune:" + t); reTime.ReSetTiming(reTime.GetStart() - t); start.ReSetTiming(reTime.GetEnd() - t); TimeLine.RemoveAt(TimeLine.Count - 1); TimeLine.Add(reTime); TimeLine.Add(start); return; } } else if (start.GetAction() == "SLIDE" && obj.JUMPTime() > 0) { Debug.Log("BeforeAfterReTune"); Schedule reTime = new Schedule(start.GetStart() - 56, 56, "JUMP"); for (int i = 0; i < reTime.GetStart() - frameCount; i++) { if (obj.GetFrame() > reTime.GetEnd() + obj.GetDisStart(start.GetAction()) - i && objectList[objectList.Count - 2].GetFrame() <= reTime.GetStart() + objectList[objectList.Count - 2].GetDisEnd(reTime.GetAction()) - i) { Debug.Log("成功"); t = i; break; } } if (t >= 0) { Debug.Log("TimingBeforeAfterReTune:" + t); reTime.ReSetTiming(reTime.GetStart() - t); start.ReSetTiming(reTime.GetEnd() - t); TimeLine.RemoveAt(TimeLine.Count - 1); TimeLine.Add(reTime); TimeLine.Add(start); return; } } Debug.Log("無理" + obj.GetFrame()); collider.gameObject.GetComponent <Renderer>().material = hantoumei; } }
/*Scheduleがないとき、そのままScheduleをTimeLineへ送る*/ void Scheduling(ComeObject obj) { Schedule start = obj.ActTiming(JUMP, SLIDE, frameCount); TimeLine.Add(start); }