/*DisListとフレームから一番良い動作、タイミングを検索しSchedule3にする*/ public Schedule3 ActTiming(List <ActPosition3> j, List <ActPosition3> s, int f) { int maxJ = 0; Schedule3 result; for (int i = 0; i < JUMPdisList.Length; i++) { if (JUMPdisList[i] > JUMPdisList[maxJ]) { maxJ = i; } } int maxS = 0; for (int i = 0; i < SLIDEdisList.Length; i++) { if (SLIDEdisList[i] > SLIDEdisList[maxS]) { maxS = i; } } if (JUMPdisList[maxJ] >= SLIDEdisList[maxS]) { Debug.Log("JUMP!" + GetDisStart("JUMP") + ":" + GetDisEnd("JUMP")); result = new Schedule3(f + comeTiming - j[maxJ].GetFrame(), 56, "JUMP"); return(result); } else { Debug.Log("SLIDE!" + GetDisStart("SLIDE") + ":" + GetDisEnd("SLIDE")); result = new Schedule3(f + comeTiming - s[maxS].GetFrame(), 40, "SLIDE"); return(result); } }
/*Schedule3があるとき、すでに入っているSchedule3と比較して処理*/ void ReScheduling(ComeObject3 obj, Collider collider) { Schedule3 start = obj.ActTiming(JUMP, SLIDE, frameCount); if (start.GetStart() > TimeLine[TimeLine.Count - 1].GetEnd()) { /*すでに入っているSchedule3と干渉しないとき、そのままSchedule3を送る*/ TimeLine.Add(start); } else { /*すでに入っているSchedule3と干渉するとき*/ 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"); Schedule3 reTime = new Schedule3(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"); Schedule3 reTime = new Schedule3(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"); Schedule3 reTime = new Schedule3(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"); Schedule3 reTime = new Schedule3(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; } }
/*Schedule3がないとき、そのままSchedule3をTimeLineへ送る*/ void Scheduling(ComeObject3 obj) { Schedule3 start = obj.ActTiming(JUMP, SLIDE, frameCount); TimeLine.Add(start); }