5/23記録

今日やったこと

ワーキングメモリーレーニン

鬼ネズミ、鬼計算、計算20、計算100をやりました。

Lv10と11を中心に120問やりました。

力学の勉強

英語

  • 音読英単語入門編 Unit1~4 5周目

ゲーム開発

Packが反発しないバグの解決

このようなPackが反発しないバグを解決しました。

f:id:alberto_hojo:20190523133539g:plain

原因は諸々のGameObjectのRigidbodyコンポーネントConstraintsの制限を課しすぎていたことなのではないか?と思っています。

f:id:alberto_hojo:20190523143243p:plain

物体の運動を制限し過ぎて力学的な計算が上手くいっていなかったのではないか、ということです。

なのでConstraintsを一部解除し、PlayerEnemyMassの値を極端に大きくし、PackMassを小さくすることにより、自然に物理の計算を行なうことにしました。

この方法以外では、isKinematictrueにして物理演算を行うことを諦める方法もあるそうです。

【Unity】エアホッケーでうまく弾けない

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を作り、その子オブジェクトとしてWinTextLoseTextを作成し、それらを管理する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);
    }
}

というところで今日は終了です。

現段階のクラス図は下のような感じになっています。

f:id:alberto_hojo:20190524000049p:plain

結果

JINS MEME ESという最新の学術研究の成果を元に人間の心理状態を測定できるウェアラブルバイスを使って本日の僕の集中状態を測定した結果は以下のようになりました。

f:id:alberto_hojo:20190524000543p:plain

作業時間 9時間6分 + 英語シャドーイング1時間

集中時間 2時間42分

集中率 30%

反省

今日は少しダラけてしまいました。

明日からは下記のことに気をつけて頑張ろうと思います。

  • スマホ禁を守る

  • ポモドーロテクニックを守る

  • 休憩や瞑想をしっかり行う

  • 活力が無くなったら軽く筋トレする

  • 腰が痛くなったらストレッチを入念に行う

  • 早く寝る(1時頃には寝たい)