void LiftEndObject(GameObject _obj, bool _liftUp) { // 持ち上げ中オブジェクトの判定と挙動を無効化/有効化 liftObj.GetComponent <BoxCollider>().enabled = !_liftUp; liftObj.GetComponent <MoveManager>().enabled = !_liftUp; // 通常時のプレイヤー当たり判定を無効化/有効化 standbyCol.enabled = !_liftUp; // 持ち上げ中のプレイヤー当たり判定有効化時に接地方向によって判定位置を移動 if (_liftUp) { BoxCollider liftingBoxCol = ((BoxCollider)liftingCol); if (Pl.GetComponent <WeightManager>().WeightForce < 0.0f) { liftingBoxCol.center = new Vector3(liftingBoxCol.center.x, stdLiftingColPoint, liftingBoxCol.center.z); } else { liftingBoxCol.center = new Vector3(liftingBoxCol.center.x, revLiftingColPoint, liftingBoxCol.center.z); } } // 持ち上げ中のプレイヤー当たり判定を有効化/無効化 liftingCol.enabled = _liftUp; // 有効な当たり判定をMoveManagerに登録 if (standbyCol.enabled) { MoveMng.UseCol = standbyCol; } else { MoveMng.UseCol = liftingCol; } // 持ち上げきったのなら if (_liftUp) { // 持ち上げ状態に遷移 St = LiftState.lifting; } // 下ろし切ったのなら else { // 待機状態に遷移 St = LiftState.standby; // 持ち上げオブジェクト中をnullに liftObj = null; // プレイヤーの重さ移しを可能に Pl.CanShift = true; } // プレイヤーのジャンプ、振り向きを可能に Pl.CanJump = true; Pl.CanRotation = true; }
public GameObject Lift() { Debug.Log("lift"); switch (St) { case LiftState.standby: // 重さ変更中は処理しない if (Pl.IsShift) { return(null); } // 範囲内で最も近い持ち上げられるオブジェクトを取得 List <RaycastHit> hitInfos = new List <RaycastHit>(); // hitInfos.AddRange(Physics.BoxCastAll(transform.position, liftUpCol.localScale * 0.5f, (liftUpCol.position - transform.position), // liftPoint.rotation, Vector3.Distance(transform.position, liftUpCol.position), boxMask)); hitInfos.AddRange(Physics.BoxCastAll(liftUpCol.transform.position, liftUpCol.localScale * 0.5f, (transform.position - liftUpCol.position), liftPoint.rotation, float.Epsilon, boxMask)); GameObject liftableObj = null; float dis = float.MaxValue; Debug.LogWarning(hitInfos.Count); foreach (var hitInfo in hitInfos) { Debug.LogWarning(hitInfo.collider.name + " " + hitInfo.collider.tag); if ((hitInfo.collider.tag == "LiftableObject") && (hitInfo.distance < dis)) { liftableObj = hitInfo.collider.gameObject; dis = hitInfo.distance; } } // 持ち上げれるオブジェクトがあれば if (liftableObj != null) { // 重さがプレイヤーより重ければ失敗フラグを立てる heavyFailedFlg = (Pl.GetComponent <WeightManager>().WeightLv < liftableObj.GetComponent <WeightManager>().WeightLv); // ジャンプ、重さ変更、振り向きを不可に Pl.CanJump = false; Pl.CanShift = false; Pl.CanRotation = false; // 持ち上げ開始 return(LiftUp(liftableObj)); } else { liftObj = null; } break; case LiftState.lifting: // ジャンプ、重さ変更、振り向きを不可に Pl.CanJump = false; Pl.CanShift = false; Pl.CanRotation = false; // 下ろし始める LiftDown(); break; default: break; } return(null); }
public GameObject Lift() { // 処理後状態なら入力が解除されるまで処理しない if (afterHoldInput) { return(null); } Debug.Log("lift"); switch (St) { case LiftState.standby: // 重さ変更中は処理しない if (Pl.IsShift) { return(null); } // 範囲内で最も近い持ち上げられるオブジェクトを取得 List <RaycastHit> hitInfos = new List <RaycastHit>(); // hitInfos.AddRange(Physics.BoxCastAll(transform.position, liftUpCol.localScale * 0.5f, (liftUpCol.position - transform.position), // liftPoint.rotation, Vector3.Distance(transform.position, liftUpCol.position), boxMask)); hitInfos.AddRange(Physics.BoxCastAll(liftUpCol.transform.position, liftUpCol.localScale * 0.5f, (transform.position - liftUpCol.position), liftPoint.rotation, float.Epsilon, boxMask)); // 浮いているオブジェクトは持ち上げられない for (int idx = hitInfos.Count - 1; idx >= 0; idx--) { Landing hitInfoLand = hitInfos[idx].collider.GetComponent <Landing>(); WaterState hitInfoWaterStt = hitInfos[idx].collider.GetComponent <WaterState>(); if ((!hitInfoLand || !hitInfoWaterStt) || (!hitInfoLand.IsLanding && !hitInfoLand.IsWaterFloatLanding && !hitInfoWaterStt.IsWaterSurface)) { hitInfos.RemoveAt(idx); } } // 上下をオブジェクトに挟まれている場合 if (Pl.IsSandwitch) { // 挟んでいるオブジェクト以外は持ち上げ対象から除外 for (int idx = hitInfos.Count - 1; idx >= 0; idx--) { if (!Pl.SandwitchCols.Contains(hitInfos[idx].collider)) { hitInfos.RemoveAt(idx); } } } GameObject liftableObj = null; float dis = float.MaxValue; // Debug.LogWarning(hitInfos.Count); foreach (var hitInfo in hitInfos) { // Debug.LogWarning(hitInfo.collider.name + " " + hitInfo.collider.tag); if (!underPriority) { if ((hitInfo.collider.tag == "LiftableObject") && (hitInfo.distance < dis)) { liftableObj = hitInfo.collider.gameObject; dis = hitInfo.distance; } } else { if ((hitInfo.collider.tag == "LiftableObject") && (!liftableObj || (hitInfo.transform.position.y < liftableObj.transform.position.y))) { liftableObj = hitInfo.collider.gameObject; } } } // 持ち上げれるオブジェクトがあれば if (liftableObj != null) { if (!canHeavyLift) { // 重さがプレイヤーより重ければ失敗フラグを立てる heavyFailedFlg = (Pl.GetComponent <WeightManager>().WeightLv < liftableObj.GetComponent <WeightManager>().WeightLv); } // ジャンプ、重さ変更、振り向きを不可に Pl.CanJump = false; Pl.CanShift = false; Pl.CanRotationTurn = false; // 移動量を削除 MoveMng.StopMoveVirticalAll(); MoveMng.StopMoveHorizontalAll(); // 持ち上げ中のオブジェクトが水で浮かないように WaterState liftWaterStt = liftableObj.GetComponent <WaterState>(); liftWaterStt.CanFloat = false; // 持ち上げ開始 return(LiftUpStart(liftableObj)); } else { // 持ち上げキャンセル LiftObj = null; } break; case LiftState.lifting: // 重さ変更中は処理しない if (Pl.IsShift) { return(null); } //// 持ち上げ中オブジェクト以外のすり抜け中のオブジェクトがある場合は処理しない //foreach (var throughObj in MoveMng.ThroughObjList) { // if (throughObj != LiftObj) { // return null; // } //} // ジャンプ、重さ変更、振り向きを不可に Pl.CanJump = false; Pl.CanShift = false; Pl.CanRotationTurn = false; // 下ろし始める LiftDownStart(); // 移動量を削除 MoveMng.StopMoveVirticalAll(); MoveMng.StopMoveHorizontalAll(); break; default: break; } return(null); }