今日やったこと
ワーキングメモリートレーニング
瞑想
鬼ネズミ、鬼計算、計算20、計算100をやりました。
Lv10と11を中心に120問やりました。
力学の勉強
英語
- 音読英単語入門編 Unit1~4 5周目
ゲーム開発
Packが反発しないバグの解決
このようなPackが反発しないバグを解決しました。
原因は諸々のGameObjectのRigidbody
コンポーネントのConstraints
の制限を課しすぎていたことなのではないか?と思っています。
物体の運動を制限し過ぎて力学的な計算が上手くいっていなかったのではないか、ということです。
なのでConstraints
を一部解除し、Player
とEnemy
のMass
の値を極端に大きくし、Pack
のMass
を小さくすることにより、自然に物理の計算を行なうことにしました。
この方法以外では、isKinematic
をtrue
にして物理演算を行うことを諦める方法もあるそうです。
isKinematic
って何だっけ?と思ったので下のサイトで勉強しました。
【Unity】RigidbodyのIsKinematic(物理演算の影響の有無)を変えて実験
Enemyの動きの実装
AIと呼べるほどのものではないですが、敵の動きを自動的に制御するクラス、EnemyMoverクラスを作成しました。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UniRx; using UniRx.Triggers; using Zenject; public class EnemyMover : MonoBehaviour { [Inject] GameStateManager gameStateManager; [SerializeField] private PlayerMover playerMover; [SerializeField] private Transform packPosition; private float speed; private Rigidbody rb; private Vector3 leftVector; private Vector3 rightVector; // Start is called before the first frame update void Start() { leftVector = new Vector3(-1, 0, 0); rightVector = new Vector3(1, 0, 0); rb = this.GetComponent<Rigidbody>(); this.speed = playerMover.speed; MoveEnemy(); } private void MoveEnemy() { this.UpdateAsObservable() .Where(_ => gameStateManager.CurrentGameState.Value == GameState.Play) .Where(_ => packPosition.position.x < this.transform.position.x) .Subscribe(_ => rb.AddForce(leftVector * speed)); this.UpdateAsObservable() .Where(_ => gameStateManager.CurrentGameState.Value == GameState.Play) .Where(_ => packPosition.position.x > this.transform.position.x) .Subscribe(_ => rb.AddForce(rightVector * speed)); } }
勝敗の判定
勝敗を判定するPlayerWinJudger
クラスとPlayerLoseJudger
クラスを作成しました。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UniRx; using UniRx.Triggers; using Zenject; public class PlayerWinJudger : MonoBehaviour { [Inject] GameStateManager gameStateManager; // Start is called before the first frame update void Start() { JudgePlayerVictory(); } private void JudgePlayerVictory() { this.OnTriggerEnterAsObservable() .Select(collision => collision.tag) .Where(collisionTag => collisionTag == "Pack") .Where(_ => gameStateManager.CurrentGameState.Value == GameState.Play) .Subscribe(_ => gameStateManager.SetGameState(GameState.Result)); } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using UniRx; using UniRx.Triggers; using Zenject; public class PlayerLoseJudger : MonoBehaviour { [Inject] GameStateManager gameStateManager; // Start is called before the first frame update void Start() { JudgePlayerLose(); } private void JudgePlayerLose() { this.OnTriggerEnterAsObservable() .Select(collision => collision.tag) .Where(collisionTag => collisionTag == "Pack") .Where(_ => gameStateManager.CurrentGameState.Value == GameState.Play) .Subscribe(_ => gameStateManager.SetGameState(GameState.Result)); } }
Result画面を作る
ResultUI
という名前の空のGameObject
を作り、その子オブジェクトとしてWinText
とLoseText
を作成し、それらを管理するWinTextDisplayer
クラスとLoseTextDisplayer
クラスを作りました。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Zenject; using UniRx; public class WinTextDisplayer : MonoBehaviour { [Inject] private VictoryStateManager victoryStateManager; // Start is called before the first frame update void Start() { DisplayWinText(); HideWinText(); } private void DisplayWinText() { victoryStateManager .CurrentVictoryState .Where(state => state == VictoryState.Win) .Subscribe(_ => this.gameObject.SetActive(true)) .AddTo(this); } private void HideWinText() { victoryStateManager .CurrentVictoryState .Where(state => state != VictoryState.Win) .Subscribe(_ => this.gameObject.SetActive(false)) .AddTo(this); } }
using System.Collections; using System.Collections.Generic; using UnityEngine; using Zenject; using UniRx; public class LoseTextDisplayer : MonoBehaviour { [Inject] private VictoryStateManager victoryStateManager; // Start is called before the first frame update void Start() { DisplayLoseText(); HideLoseText(); } private void DisplayLoseText() { victoryStateManager .CurrentVictoryState .Where(state => state == VictoryState.Lose) .Subscribe(_ => this.gameObject.SetActive(true)) .AddTo(this); } private void HideLoseText() { victoryStateManager .CurrentVictoryState .Where(state => state != VictoryState.Lose) .Subscribe(_ => this.gameObject.SetActive(false)) .AddTo(this); } }
というところで今日は終了です。
現段階のクラス図は下のような感じになっています。
結果
JINS MEME ESという最新の学術研究の成果を元に人間の心理状態を測定できるウェアラブルデバイスを使って本日の僕の集中状態を測定した結果は以下のようになりました。
作業時間 9時間6分 + 英語シャドーイング1時間
集中時間 2時間42分
集中率 30%
反省
今日は少しダラけてしまいました。
明日からは下記のことに気をつけて頑張ろうと思います。
スマホ禁を守る
ポモドーロテクニックを守る
休憩や瞑想をしっかり行う
活力が無くなったら軽く筋トレする
腰が痛くなったらストレッチを入念に行う
早く寝る(1時頃には寝たい)