void AddPileBoxList(List <Transform> _boxList, Vector3 _vec, bool _ignoreOnStgObj) { List <Transform> forward = new List <Transform>(); // 対象コライダー List <Transform> back = new List <Transform>(); // 除外コライダー // 判定用マスク int mask = LayerMask.GetMask(new string[] { "Player", "Box" }); //Debug.Log("AddChainBoxList"); // 四辺コライダーを指定方向側と反対方向側に振り分け DotFourSideCollider(_vec, forward, back); // 指定方向側の四辺コライダーに接触している対象オブジェクトのコライダーをリスト化 List <Collider> hitColList = new List <Collider>(); for (int idx = 0; idx < forward.Count; idx++) { hitColList.AddRange(Physics.OverlapBox(forward[idx].transform.position, forward[idx].transform.lossyScale * 0.5f, forward[idx].transform.rotation, mask)); } // 対象オブジェクトのコライダーのリストをオブジェクトのリストに変換 List <Transform> hitObjList = new List <Transform>(); while (hitColList.Count > 0) { hitObjList.Add(hitColList[0].transform); hitColList.RemoveAt(0); } // 重複を排除 RemoveDuplicateObject(hitObjList); // 自身を排除 hitObjList.Remove(transform); for (int i = hitObjList.Count - 1; i >= 0; i--) { //パイルを持っていないオブジェクトは排除 if (hitObjList[i].GetComponent <PileWeight>() == null) { hitObjList.RemoveAt(i); } // PileWeihgtの対象とならないフラグがtrueのオブジェクトを排除 else if (hitObjList[i].GetComponent <PileWeight>().ignoreOtherPileTarget) { hitObjList.RemoveAt(i); } } // ステージに乗っているオブジェクトは排除 if (_ignoreOnStgObj) { for (int idx = hitObjList.Count - 1; idx >= 0; idx--) { List <Collider> landColList = hitObjList[idx].GetComponent <Landing>().LandColList; if (landColList != null) { foreach (var landCol in landColList) { if (landCol.gameObject.layer == LayerMask.NameToLayer("Stage")) { hitObjList.RemoveAt(idx); break; } } } } } // 指定方向の反対側の四辺コライダーに接触している対象オブジェクトのコライダーをリスト化 List <Collider> outColList = new List <Collider>(); for (int idx = 0; idx < back.Count; idx++) { outColList.AddRange(Physics.OverlapBox(back[idx].transform.position, back[idx].transform.lossyScale * 0.5f, back[idx].transform.rotation, mask)); } // 除外オブジェクトのコライダーのリストをオブジェクトのリストに変換 List <Transform> outObjList = new List <Transform>(); while (outColList.Count > 0) { outObjList.Add(outColList[0].transform); outColList.RemoveAt(0); } // 重複を排除 RemoveDuplicateObject(outObjList); // 自身を排除 outObjList.Remove(transform); // 指定方向から遠いコライダ-に接触している対象オブジェクトをリストから排除 for (int outObjIdx = 0; outObjIdx < outObjList.Count; outObjIdx++) { hitObjList.Remove(outObjList[outObjIdx]); } // 既存リストに存在する排除対象オブジェクトをリストから除外 for (int boxListIdx = 0; boxListIdx < _boxList.Count; boxListIdx++) { hitObjList.Remove(_boxList[boxListIdx]); } // リスト内の対象オブジェクトを既存リストと統合 _boxList.AddRange(hitObjList); // リストの重複を排除 RemoveDuplicateObject(_boxList); // // 自身から離れるように動いているオブジェクトを排除 // for (int boxListIdx = _boxList.Count - 1; boxListIdx >= 0; boxListIdx--) { // MoveManager boxMoveMng = _boxList[boxListIdx].GetComponent<MoveManager>(); // if (boxMoveMng && (Mathf.Sign(boxMoveMng.PrevMove.y) != Mathf.Sign(_boxList[boxListIdx].transform.position.y - transform.position.y))) { // _boxList.RemoveAt(boxListIdx); // } // } // 新たな対象オブジェクトそれぞれで再帰呼び出し for (int hitObjIdx = 0; hitObjIdx < hitObjList.Count; hitObjIdx++) { PileWeight otherBox = hitObjList[hitObjIdx].GetComponent <PileWeight>(); if (otherBox != null) { // 再帰呼び出し otherBox.AddPileBoxList(_boxList, _vec, _ignoreOnStgObj); } } }
void AddPileBoxList(List <Transform> _boxList, Vector3 _vec) { List <Transform> forward = new List <Transform>(); // 対象コライダー List <Transform> back = new List <Transform>(); // 除外コライダー // 判定用マスク int mask = LayerMask.GetMask(new string[] { "Player", "Box" }); //Debug.Log("AddChainBoxList"); // 四辺コライダーを指定方向側と反対方向側に振り分け DotFourSideCollider(_vec, forward, back); // 指定方向側の四辺コライダーに接触している対象オブジェクトのコライダーをリスト化 List <Collider> hitColList = new List <Collider>(); for (int idx = 0; idx < forward.Count; idx++) { hitColList.AddRange(Physics.OverlapBox(forward[idx].transform.position, forward[idx].transform.localScale * 0.5f, forward[idx].transform.rotation, mask)); } // 対象オブジェクトのコライダーのリストをオブジェクトのリストに変換 List <Transform> hitObjList = new List <Transform>(); while (hitColList.Count > 0) { hitObjList.Add(hitColList[0].transform); hitColList.RemoveAt(0); } // 重複を排除 RemoveDuplicateObject(hitObjList); // 自身を排除 hitObjList.Remove(transform); //パイルを持っていないオブジェクトは排除 for (int i = hitObjList.Count - 1; i >= 0; i--) { if (hitObjList[i].GetComponent <PileWeight>() == null) { hitObjList.RemoveAt(i); } } // 指定方向の反対側の四辺コライダーに接触している対象オブジェクトのコライダーをリスト化 List <Collider> outColList = new List <Collider>(); for (int idx = 0; idx < back.Count; idx++) { outColList.AddRange(Physics.OverlapBox(back[idx].transform.position, back[idx].transform.localScale * 0.5f, back[idx].transform.rotation, mask)); } // 除外オブジェクトのコライダーのリストをオブジェクトのリストに変換 List <Transform> outObjList = new List <Transform>(); while (outColList.Count > 0) { outObjList.Add(outColList[0].transform); outColList.RemoveAt(0); } // 重複を排除 RemoveDuplicateObject(outObjList); // 自身を排除 outObjList.Remove(transform); // 指定方向から遠いコライダ-に接触している対象オブジェクトをリストから排除 for (int outObjIdx = 0; outObjIdx < outObjList.Count; outObjIdx++) { hitObjList.Remove(outObjList[outObjIdx]); } // 既存リストに存在する排除対象オブジェクトをリストから除外 for (int boxListIdx = 0; boxListIdx < _boxList.Count; boxListIdx++) { hitObjList.Remove(_boxList[boxListIdx]); } // リスト内の対象オブジェクトを既存リストと統合 _boxList.AddRange(hitObjList); // リストの重複を排除 RemoveDuplicateObject(_boxList); // 新たな対象オブジェクトそれぞれで再帰呼び出し for (int hitObjIdx = 0; hitObjIdx < hitObjList.Count; hitObjIdx++) { PileWeight otherBox = hitObjList[hitObjIdx].GetComponent <PileWeight>(); if (otherBox != null) { // 再帰呼び出し otherBox.AddPileBoxList(_boxList, _vec); } } }
bool Jump() { // ジャンプ入力(トリガー)がなければ if (!jumpStandbyFlg || prevJumpStandbyFlg) { return(false); } // ジャンプ可能でなければ if (!canJump) { return(false); } // ステージに接地、又は水面で安定していなければ Debug.LogWarning("IsLanding:" + Land.IsLanding); //if (!Land.IsLanding && !WaterStt.IsWaterSurface) { if (!(Land.IsLanding || WaterStt.IsWaterSurface)) { PileWeight pile = GetComponent <PileWeight>(); // 接地、又は安定しているオブジェクトにも接地していなければ List <Transform> pileObjs = pile.GetPileBoxList(new Vector3(0.0f, MoveMng.GravityForce, 0.0f)); bool stagePile = false; foreach (var pileObj in pileObjs) { Landing pileLand = pileObj.GetComponent <Landing>(); WaterState pileWaterStt = pileObj.GetComponent <WaterState>(); if ((pileLand && (pileLand.IsLanding || pileLand.IsExtrusionLanding)) || (pileWaterStt && (pileWaterStt.IsWaterSurface))) { stagePile = true; } } if ((pileObjs.Count == 0) || !stagePile) { // ジャンプ不可 return(false); } } // ジャンプ直後であれば // if (jumpLimitTime > Time.time) return; Debug.Log("Jump"); // ジャンプアニメーション if (!Lift.IsLifting) { PlAnim.StartJump(); } else { PlAnim.StartHoldJump(); } // 前回までの上下方向の加速度を削除 MoveMng.StopMoveVirtical(MoveManager.MoveType.prevMove); // 左右方向の加速度を削除 // MoveMng.StopMoveHorizontalAll(); // 左右方向の移動量も一更新だけ制限 MoveMng.OneTimeMaxSpd = jumpStartOneTimeLimitSpd; // 上方向へ加速 //float jumpGravityForce = (0.5f * Mathf.Pow(jumpTime * 0.5f, 2) + jumpHeight); // ジャンプ中の重力加速度 // float jumpGravityForce = -100; // ジャンプ中の重力加速度 // MoveMng.AddMove(new Vector3(0.0f, (-jumpGravityForce * JumpTime * 0.5f), 0.0f)); // Debug.Log(jumpGravityForce); MoveMng.AddMove(new Vector3(0.0f, (JumpHeight), 0.0f)); // 離地 Land.IsLanding = false; WaterStt.IsWaterSurface = false; WaterStt.BeginWaterStopIgnore(); // ジャンプ入力を無効化 jumpStandbyFlg = false; // 通常の重力加速度を一時的に無効 //MoveMng.GravityCustomTime = (Time.time + JumpTime); //MoveMng.GravityForce = jumpGravityForce; // 次回ジャンプ可能時間を設定 // jumpLimitTime = Time.time + jumpTime * 0.5f; // ジャンプしてからジャンプ滞空時間の半分の時間まではジャンプ不可 return(true); }