/// <summary> /// 風エフェクトの制御 /// </summary> /// <param name="mode">ゲームモード</param> /// <param name="activeFlag">風の有効状態</param> /// <param name="index">風の方位番号</param> private void WindEffectControl(PlayState.GameMode mode, bool activeFlag, int index) { if (activeFlag) { if (mode != PlayState.GameMode.Pause) { if (windEffect[index].isPlaying == false) { windEffect[index].Play(); } } else { if (windEffect[index].isPlaying) { windEffect[index].Pause(); } } } else { if (windEffect[index].isStopped == false) { windEffect[index].Stop(); } } }
void Start() { //初期化 startCameraFlg = true; XZangle = fAngle; CameraDis = lookMode ? CameraDisP: CameraDisS; MouseCheck = true; gameMode = PlayState.playState.gameMode; }
// Update is called once per frame void Update() { gameMode = GetGameMode(); SetPlayerGameState(); SetEnemyGameState(); CheckEnemyState(); // 落雷できるかチェック if (enemy != null) { IsCanLightningStrike = enemy.ElectricEnemies != null && enemy.ElectricEnemies.Count > 0; } else { IsCanLightningStrike = false; } GetLightningStrikePoint(); CheckElectricDamage(); }
private void Update() { try { gameMode = PlayState.playState.gameMode; } catch { gameMode = PlayState.GameMode.Play; } if (waterHi != null) { // 足場が移動できる範囲を取得 Ray ray = new Ray(transform.position, Vector3.down); RaycastHit hit; if (Physics.Raycast(ray, out hit, 200f, groundLayerMask)) { minPosition = hit.point + Vector3.up * boxCollider.size.y * 0.5f; } else { minPosition = new Vector3(transform.position.x, boxCollider.size.y * 0.5f, transform.position.z); } waterPosition = new Vector3(transform.position.x, waterHi.max - (boxCollider.size.y * 0.5f - 0.06f), transform.position.z); ray = new Ray(transform.position, Vector3.up); if (Physics.Raycast(ray, out hit, 200f, groundLayerMask)) { maxPosition = hit.point + Vector3.down * boxCollider.size.y * 0.5f; } else { maxPosition = new Vector3(transform.position.x, StageMake.LoadStageData.stageSize.y + boxCollider.size.y * 0.5f, transform.position.z); } isLock = gameMode == PlayState.GameMode.RotationPot; isFall = PlayState.playState.IsFallBox && isLock; if (isFall) { Vector3 target = minPosition.y > waterPosition.y ? minPosition : waterPosition; if (Vector3.Distance(transform.position, target) > 0.1f) { if (gameMode != PlayState.GameMode.Pause) { transform.position = Vector3.MoveTowards(transform.position, target, 5.0f * Time.deltaTime); } } else { isFall = false; transform.position = target; } } else { if (isLock == false) { if (minPosition.y + (boxCollider.size.y * 0.5f - 0.06f) > waterHi.max) { transform.position = minPosition; } else if (maxPosition.y + (boxCollider.size.y * 0.5f - 0.06f) < waterHi.max) { transform.position = maxPosition; } else { transform.position = new Vector3(transform.position.x, waterHi.max - (boxCollider.size.y * 0.5f - 0.06f), transform.position.z); } } } } else { try { waterHi = Progress.progress.waterHi; }catch { } } isInWater = waterHi != null && transform.position.y < waterHi.max; }
private void LateUpdate() { //カメラの移動可能なゲームモード&アメフラシの演出中ではない if ((PlayState.playState.gameMode == PlayState.GameMode.Play || PlayState.playState.gameMode == PlayState.GameMode.StartEf || PlayState.playState.gameMode == PlayState.GameMode.ClearFront) || rainPotChange) { //注視点変更アニメーション中 if (lookAnimeTime > 0) { transform.position = Vector3.Lerp(animePos, (new Vector3(Mathf.Cos(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad), Mathf.Sin(Yangle * Mathf.Deg2Rad) + newLookHi, Mathf.Sin(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad)) * (!lookMode ? CameraDisS : CameraDisP)) + lookObj, 1 - (lookAnimeTime / changeTime)); } else { //注視点がプレイヤー if (lookMode) { //カメラがステージに埋まっているかどうかの処理 if (Physics.OverlapSphere((new Vector3(Mathf.Cos(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad), Mathf.Sin(Yangle * Mathf.Deg2Rad) + newLookHi, Mathf.Sin(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad)) * CameraDis) + lookObj, sphereCollider.radius, layerMask).Length == 0) { endCameraPos = CameraDis; } else { Ray ray = new Ray(PlayerTransform.position + new Vector3(0, LookHiSet, 0), Vector3.Normalize(transform.position - (PlayerTransform.position + new Vector3(0, LookHiSet, 0)))); RaycastHit hit; if (Physics.SphereCast(ray, sphereCollider.radius, out hit, CameraDis, layerMask) && CameraColFlg) { endCameraPos = Vector3.Distance(hit.point, PlayerTransform.position + new Vector3(0, LookHiSet, 0)); } else { endCameraPos = CameraDis; } } } else { endCameraPos = CameraDis; } //座標移動 transform.position = (new Vector3(Mathf.Cos(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad), Mathf.Sin(Yangle * Mathf.Deg2Rad) + newLookHi, Mathf.Sin(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad)) * endCameraPos) + lookObj; } //角度変更 transform.localEulerAngles = new Vector3(Yangle, -XZangle - 90, 0); } else if (GameEndFlg) { if (EndAfterTime < GameEndEfSpan) { transform.position = Vector3.Lerp( transformToGameEnd, (new Vector3(Mathf.Cos(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad), Mathf.Sin(Yangle * Mathf.Deg2Rad) + newLookHi, Mathf.Sin(XZangle * Mathf.Deg2Rad) * Mathf.Cos(Yangle * Mathf.Deg2Rad)) * GameEndDis) + PlayerTransform.position + new Vector3(0, LookHiSet, 0), (EndAfterTime / GameEndEfSpan) ); EndAfterTime += Time.deltaTime; } } //ゲームの終了を検知するシーケンサー if (gameMode != PlayState.playState.gameMode) { if (PlayState.playState.gameMode == PlayState.GameMode.GameOver || PlayState.playState.gameMode == PlayState.GameMode.Clear) { //ゲーム終了後の演出開始時の処理 // if (PlayState.playState.gameMode == PlayState.GameMode.Clear) { animator.SetBool("Set", true); } else { GameEndFlg = true; } EndAfterTime = 0; transformToGameEnd = transform.position; if (lookAnimeTime > 0) { disToGameEnd = !lookMode ? CameraDisS : CameraDisP; } else { disToGameEnd = endCameraPos; } } if (PlayState.playState.gameMode == PlayState.GameMode.Thunder) { kari = false; lotDis = endCameraPos; lotPos = PlayerTransform.position; lotYAn = Yangle; //Debug.Log(lotPos); LightningStrikeAction = ChaMs.LightningStrikePoint.transform.position; } gameMode = PlayState.playState.gameMode; } if (PlayState.playState.gameMode == PlayState.GameMode.Thunder) { float dis = 0; float Ttime = PlayState.playState.ThunderTime; int brea; float neoY = 0; Vector3 trg = Vector3.zero; if (Ttime > 4f) { brea = 1; } else if (Ttime > 1f) { brea = 2; } else { brea = 3; } switch (brea) { case 1: trg = Vector3.Lerp(lotPos, LightningStrikeAction, (5 - Ttime)); dis = Mathf.Lerp(lotDis, Tdis, (5 - Ttime)); neoY = Mathf.Lerp(lotYAn, 30, (5 - Ttime)); break; case 2: if (!kari) { kari = true; ChaMs.LightningStrikeAction(); } trg = Vector3.Lerp(lotPos, LightningStrikeAction, 1); dis = Mathf.Lerp(lotDis, Tdis, 1); neoY = Mathf.Lerp(lotYAn, 30, 1); break; case 3: trg = Vector3.Lerp(LightningStrikeAction, lotPos, (1 - Ttime)); dis = Mathf.Lerp(Tdis, lotDis, 1 - Ttime); neoY = Mathf.Lerp(30, lotYAn, (1 - Ttime)); break; } //Debug.Log(neoY); transform.position = ( new Vector3 (Mathf.Cos(XZangle * Mathf.Deg2Rad) * Mathf.Cos(neoY * Mathf.Deg2Rad), Mathf.Sin(neoY * Mathf.Deg2Rad) + newLookHi, Mathf.Sin(XZangle * Mathf.Deg2Rad) * Mathf.Cos(neoY * Mathf.Deg2Rad)) * dis) + trg + new Vector3(0, LookHiSet, 0); transform.localEulerAngles = new Vector3(neoY, -XZangle - 90, 0); } }
/// <summary> /// プレイヤーの移動処理 /// </summary> private void PlayerMove(bool fixedUpdate) { if (connectPlayState) { mode = PlayState.playState.gameMode; } else { mode = PlayState.GameMode.Play; } if (mode == PlayState.GameMode.Play) { bool input; float inputSpeed = (Mathf.Abs(inputX) + Mathf.Abs(inputZ)) * 0.5f < 0.5f ? Mathf.Abs(inputX) + Mathf.Abs(inputZ) : 1.0f; // 一方通行の崖を利用する際に実行 if (CliffFlag) { foreach (var wall in hiddenWalls) { wall.enabled = false; } input = false; } else { float delta = fixedUpdate ? Time.fixedDeltaTime : Time.deltaTime; // 移動方向 Vector3 moveDirection = Vector3.zero; // 入力の最低許容値 float inputMin = 0.1f; input = (Mathf.Abs(inputX) > inputMin || Mathf.Abs(inputZ) > inputMin) && dontInput == false; if (input) { // カメラの向いている方向を取得 Vector3 cameraForward = Vector3.Scale(PlayerCamera.transform.forward == Vector3.up ? -PlayerCamera.transform.up : PlayerCamera.transform.forward == Vector3.down ? PlayerCamera.transform.up : PlayerCamera.transform.forward, new Vector3(1, 0, 1)).normalized; // プレイヤーカメラ起点の入力方向 Vector3 direction = cameraForward * inputZ + PlayerCamera.transform.right * inputX; // 入力方向を向く処理 Quaternion rot = Quaternion.LookRotation(direction, Vector3.up); rot = Quaternion.Slerp(transform.rotation, rot, 7.5f * delta); transform.rotation = rot; // 移動方向の決定 float vec = Mathf.Abs(inputX) >= Mathf.Abs(inputZ) ? inputZ / inputX : inputX / inputZ; vec = 1.0f / Mathf.Sqrt(1.0f + vec * vec); moveDirection = direction * vec; // 床にRayを飛ばして斜面の角度を取得 Ray ground = new Ray(new Vector3(transform.position.x, PlayerPositionY, transform.position.z), Vector3.down); RaycastHit hit; if (Physics.Raycast(ground, out hit, rayLength, layerMask)) { var nomal = hit.normal; Vector3 dir = moveDirection - Vector3.Dot(moveDirection, nomal) * nomal; moveDirection = dir.normalized; } // プレイヤーの移動先の算出 float speed = inWater ? playerWaterSpeed : playerSpeed; if (speedTime < maxSpeedTime) { speedTime += delta; } else { speedTime = maxSpeedTime; } moveDirection *= speed * delta * inputSpeed * curve.Evaluate(speedTime / maxSpeedTime); } else { speedTime = 0; } // プレイヤーを移動させる moveDirection.y -= gravity * delta; character.Move(moveDirection); // プレイヤーのY座標の位置情報を更新 PlayerPositionY = transform.position.y + character.center.y; // 透明な壁の設置 if (input) { SetHiddenWall(); } // 水中フラグの設定 if (StageWater != null) { inWater = PlayerPositionY < StageWater.max; UnderWater = PlayerPositionY + character.height * 0.5f < StageWater.max; } else { inWater = false; UnderWater = false; } // AnimationEventの設定 if (animeEvent != null) { animeEvent.WaterStep = inWater; animeEvent.PlayerPosition = transform.position; } } // アニメーション実行 if (playerAnimator != null) { playerAnimator.enabled = true; playerAnimator.SetBool("wate", input); playerAnimator.SetFloat("speed", inWater ? (inputSpeed * curve.Evaluate(speedTime / maxSpeedTime)) / (playerSpeed / playerWaterSpeed) : inputSpeed * curve.Evaluate(speedTime / maxSpeedTime)); } } else { // アニメーションの停止 if (playerAnimator != null) { if (mode == PlayState.GameMode.StartEf || mode == PlayState.GameMode.Stop) { playerAnimator.enabled = true; } else { playerAnimator.enabled = false; } } } }
/// <summary> /// 敵の移動処理 /// </summary> /// <param name="fixedUpdate"></param> private void EnemyMove(bool fixedUpdate) { float delta = fixedUpdate ? Time.fixedDeltaTime : Time.deltaTime; if (connectPlayState) { mode = PlayState.playState.gameMode; } inWater = stageWater != null && transform.position.y + enemy.radius < stageWater.max; if (mode == PlayState.GameMode.Play && standby) { int nextLocation; if (finishOneLoop) { nextLocation = location - 1 < 0 ? moveType == EnemyMoveType.Lap ? moveSchedule.Length - 1 : location + 1 : location - 1; } else { nextLocation = location + 1 >= moveSchedule.Length ? moveType == EnemyMoveType.Lap ? 0 : location - 1 : location + 1; } Vector3 nextPos = moveSchedule[nextLocation]; Vector3 forward = (nextPos - transform.position).normalized; // プレイヤーと接触しているかをチェック RaycastHit hit; if (Physics.BoxCast(new Vector3(transform.position.x, transform.position.y - enemy.radius * enemySize, transform.position.z), new Vector3(enemy.radius * enemySize * 1.25f, enemy.radius * enemySize, enemy.radius * enemySize * 1.25f), Vector3.up, out hit, Quaternion.Euler(Vector3.zero), 1.0f, playerLayer)) { // プレイヤーと接触している場合はプレイヤーの方向を向く処理を実行 if (player == null) { player = hit.transform.gameObject.GetComponent <PlayerType2>(); } player.HitEnemy(RotateAnimation(transform.gameObject, (new Vector3(hit.transform.position.x, 0, hit.transform.position.z) - new Vector3(transform.position.x, 0, transform.position.z)).normalized, rotatePower * delta * 2.5f, false)); } else { switch (step) { case 0: transform.position = moveSchedule[location]; if (Vector3.Distance(transform.position, moveSchedule[nextLocation]) < 0.1f) { step = -5; } stepEnd = true; break; case 1: stepEnd = Wait(time, lateTime); time += delta; break; case 2: stepEnd = RotateAnimation(transform.gameObject, forward, rotatePower * delta, false); break; case 3: stepEnd = Wait(time, lateTime); time += delta; break; case 4: if (transform.rotation == Quaternion.LookRotation(forward)) { float vec = Mathf.Abs(forward.x) >= Mathf.Abs(forward.z) ? forward.z / forward.x : forward.x / forward.z; vec = 1.0f / Mathf.Sqrt(1.0f + vec * vec); float speed = inWater ? enemyWaterSpeed : enemySpeed; transform.position += forward * speed * delta * vec; if (Vector3.Distance(transform.position, nextPos) < 0.1f) { stepEnd = true; } } else { step = 2; } break; default: step = 0; if (finishOneLoop) { location--; if (moveType == EnemyMoveType.Lap) { if (location < 0) { location = moveSchedule.Length - 1; } } else { if (location < 1) { finishOneLoop = false; } } } else { location++; if (moveType == EnemyMoveType.Lap) { if (location >= moveSchedule.Length) { location = 0; } } else { if (location >= moveSchedule.Length - 1) { finishOneLoop = true; } } } return; } if (stepEnd) { stepEnd = false; step++; time = 0; } } // 足音の再生 if (enemyAnime != null) { enemyAnime.enabled = true; animationTime += delta; if (animationTime >= animationSpeed) { animationTime = 0; SoundManager.soundManager.PlaySe3D("EnemyMove", transform.position, 0.5f); } } } else { // アニメーションの停止 if (enemyAnime != null) { if (mode == PlayState.GameMode.StartEf || mode == PlayState.GameMode.Stop) { enemyAnime.enabled = true; } else { enemyAnime.enabled = false; } } } }
/// <summary> /// 風を出す処理 /// </summary> private void ShotWind() { try { gameMode = PlayState.playState.gameMode; } catch { gameMode = PlayState.GameMode.Play; } // このオブジェクトが水中に存在するかをチェック float waterPos; try { waterPos = Progress.progress.waterHi.max; } catch { waterPos = 0; } bool inWater = waterPos > transform.position.y; if (gameMode == PlayState.GameMode.Play) { upHeight = 0; downHeight = 0; if (inWater == false) { // 対象オブジェクトに風が当たったかをチェック if (forward) { CreateWind(transform.forward, 0); } if (back) { CreateWind(-transform.forward, 1); } if (right) { CreateWind(transform.right, 2); } if (left) { CreateWind(-transform.right, 3); } } if ((upHeight > 0 || downHeight > 0) && inWater == false) { float center = (upHeight - downHeight) * 0.5f; float totalHeight = upHeight + downHeight + 1; Vector3 localUp = transform.InverseTransformDirection(Vector3.up).normalized; Vector3 boxSize = new Vector3(Mathf.Abs(localUp.x) < 1 ? 1 : totalHeight, Mathf.Abs(localUp.y) < 1 ? 1 : totalHeight, Mathf.Abs(localUp.z) < 1 ? 1 : totalHeight); Vector3 boxCenter = new Vector3(Mathf.Abs(localUp.x) < 1 ? 0 : localUp.x * center, Mathf.Abs(localUp.y) < 1 ? 0 : localUp.y * center, Mathf.Abs(localUp.z) < 1 ? 0 : localUp.z * center); boxCollider.center = boxCenter; boxCollider.size = boxSize; } else { boxCollider.center = Vector3.zero; boxCollider.size = Vector3.one; } } WindEffectControl(gameMode, forward && inWater == false, 0); WindEffectControl(gameMode, back && inWater == false, 1); WindEffectControl(gameMode, right && inWater == false, 2); WindEffectControl(gameMode, left && inWater == false, 3); }
/// <summary> /// プレイヤーの移動処理 /// </summary> private void PlayerMove(bool fixedUpdate) { bool isAccess; try { mode = PlayState.playState.gameMode; isAccess = true; } catch { isAccess = false; } if (isAccess) { mode = PlayState.playState.gameMode; } // カメラの向いている方向を取得 Vector3 cameraForward = Vector3.Scale(PlayerCamera.transform.forward == Vector3.up ? -PlayerCamera.transform.up : PlayerCamera.transform.forward == Vector3.down ? PlayerCamera.transform.up : PlayerCamera.transform.forward, new Vector3(1, 0, 1)).normalized; // カメラから見た入力方向を取得 Vector3 direction = cameraForward * inputZ + PlayerCamera.transform.right * inputX; float delta = fixedUpdate ? Time.fixedDeltaTime : Time.deltaTime; if (mode != PlayState.GameMode.Pause) { bool input; float inputSpeed = Mathf.Sqrt((inputX * inputX) + (inputZ * inputZ)); // NavMeshの更新 if (mode == PlayState.GameMode.Rain) { navMeshFlag = true; specialMove = true; playerAgent.updatePosition = false; playerRigid.isKinematic = false; } else { // ナビメッシュの更新をかける if (navMeshFlag) { navMeshFlag = false; UpdateNavMesh(); } // アメフラシ起動またはジャンプの動作が終了したら座標を更新する if (specialMove && CliffFlag == false) { specialMove = false; playerAgent.Warp(transform.position); playerAgent.updatePosition = true; playerRigid.isKinematic = true; } } // 一方通行の崖を利用する際に実行 if (CliffFlag) { specialMove = true; playerAgent.updatePosition = false; input = false; } else { // 移動方向 Vector3 moveDirection = Vector3.zero; // 入力の最低許容値 float inputMin = 0.1f; input = (Mathf.Abs(inputX) > inputMin || Mathf.Abs(inputZ) > inputMin) && mode == PlayState.GameMode.Play && dontInput == false; if (input) { // 入力方向を向く処理 Quaternion rot = Quaternion.LookRotation(direction, Vector3.up); rot = Quaternion.Slerp(transform.rotation, rot, 7.5f * delta); transform.rotation = rot; // 水中かどうかをチェックし、加速度グラフに基づいた移動速度を計算 float speed = inWater ? playerWaterSpeed : playerSpeed; if (speedTime < maxSpeedTime) { speedTime += delta; } else { speedTime = maxSpeedTime; } // 地面にRayを飛ばす Ray ground = new Ray(new Vector3(transform.position.x, transform.position.y + playerCollider.center.y, transform.position.z), Vector3.down); float hitNomalY = 1.0f; if (Physics.Raycast(ground, out RaycastHit hit, rayLength, groundLayer)) { // 地面の傾斜を取得 hitNomalY = hit.normal.y; } // 斜め入力時の移動量を修正 moveDirection = direction.normalized; // 坂を移動する際の傾斜を考慮した移動量に修正 if (hitNomalY != 1.0f) { var nomal = hit.normal; Vector3 dir = moveDirection - Vector3.Dot(moveDirection, nomal) * nomal; moveDirection = dir.normalized; } // 移動量にスピード値を乗算 moveDirection *= speed * inputSpeed * curve.Evaluate(speedTime / maxSpeedTime); } else { speedTime = 0; } // プレイヤーを移動させる if (playerNav != null && playerAgent.updatePosition) { playerAgent.Move(moveDirection * delta); } // 水中フラグの設定 if (StageWater != null) { inWater = (transform.position.y + playerCollider.center.y) - (playerCollider.height * 0.25f) < StageWater.max; UnderWater = transform.position.y + playerCollider.center.y + playerCollider.height * 0.25f < StageWater.max; } else { inWater = false; UnderWater = false; } // AnimationEventの設定 if (animeEvent != null) { if (UnderWater) { animeEvent.PlayerStepMode = StepMode.UnderWater; } else if (inWater) { animeEvent.PlayerStepMode = StepMode.InWater; } else { animeEvent.PlayerStepMode = StepMode.Nomal; } animeEvent.PlayerPosition = transform.position; } } // アニメーション実行 if (playerAnimator != null) { playerAnimator.enabled = true; if (umbrellaAnimator != null) { umbrellaAnimator.enabled = true; } // 走るアニメーション playerAnimator.SetBool("Run", input); playerAnimator.SetFloat("Speed", inWater ? (inputSpeed * curve.Evaluate(speedTime / maxSpeedTime)) / (playerSpeed / playerWaterSpeed) : inputSpeed * curve.Evaluate(speedTime / maxSpeedTime)); // アメフラシを起動するアニメーション playerAnimator.SetBool("Switch", mode == PlayState.GameMode.Rain); // 崖から降りるアニメーション playerAnimator.SetBool("Jump", CliffFlag); // ゲームオーバー時のアニメーション playerAnimator.SetBool("GameOver", mode == PlayState.GameMode.GameOver); // クリア時のアニメーションを再生 if (mode == PlayState.GameMode.Clear) { if (RotateAnimation(transform.gameObject, cameraForward * -1, 360 * delta, true)) { playerAnimator.SetBool("Run", false); playerAnimator.SetBool("StageClear", true); } } } } else { // アニメーションの停止 if (playerAnimator != null) { // ポーズ中のみアニメーションを停止 playerAnimator.enabled = false; if (umbrellaAnimator != null) { umbrellaAnimator.enabled = false; } } } }