日報

今日やったこと

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

人気ゲーム分析

勉強

  • Adaptive Code

ゲーム開発

爆風との当たり判定(修正)

昨日作った爆風との当たり判定を管理するクラス、BlastHitterクラスを少し修正しました。

using UnityEngine;
using Manager;
using Zenject;
using UniRx;
using UniRx.Triggers;

namespace Player
{
    public class BlastHitter : MonoBehaviour
    {
        [Inject] private AgentStateManager agentStateManager;

        private void Start()
        {
            this.OnTriggerEnterAsObservable()
                .Where(collision => collision.tag == "Explosion")
                .Subscribe(_ => agentStateManager.SetPlayerState(AgentState.Collapse));
        }
    }
}

HPの管理

HPを管理するPlayerHPクラスを作成しました。

using UnityEngine;
using UniRx;
using UniRx.Triggers;
using Manager;
using Zenject;

namespace Player
{
    public class PlayerHP : MonoBehaviour
    {
        private ReactiveProperty<float> hp = new ReactiveProperty<float>(100.0f);

        [Inject] private AgentStateManager agentStateManager;

        // Start is called before the first frame update
        void Start()
        {
            this.agentStateManager
                .CurrentPlayerState
                .Where(state => state == AgentState.Collapse)
                .Subscribe(_ => this.hp.Value -= 20.0f)
                .AddTo(this);
        }
    }
}

倒れている状態から起き上がる処理

Collapse状態からIdle状態へ自動で遷移する処理を行う、CollapseToPlayerクラスを作成しました。

using UnityEngine;
using UniRx;
using Zenject;
using Manager;
using System;

namespace Player
{
    public class CollapseToIdle : MonoBehaviour
    {
        [Inject] AgentStateManager agentStateManager;

        // Start is called before the first frame update
        void Start()
        {
            agentStateManager
                .CurrentPlayerState
                .Where(state => state == AgentState.Collapse)
                .Delay(TimeSpan.FromSeconds(1.0f))
                .Subscribe(_ => agentStateManager.SetPlayerState(AgentState.Idle))
                .AddTo(this);
        }
    }
}

報酬を与える

自分の体力が0になると、0の報酬を自分に与え、敵に1の報酬を与えます。

また、同じように相手の体力が0になると、相手に0の報酬を与え、自分に1の報酬を与えます。

(現段階では1対1の対戦ゲームを考えています)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UniRx;
using Zenject;
using Manager;

namespace Player
{
    public class ResultStateJudger : MonoBehaviour
    {
        private PlayerHP playerHP;

        private RobotAgent robotAgent;

        private PlayerHP enemyHP;

        private RobotAgent enemyAgent;

        // Start is called before the first frame update
        private void Start()
        {
            playerHP = this.GetComponent<PlayerHP>();

            robotAgent = this.GetComponent<RobotAgent>();

            enemyHP = robotAgent.Enemy.GetComponent<PlayerHP>();

            enemyAgent = robotAgent.Enemy.GetComponent<RobotAgent>();

            JudgeResult();
        }

        private void JudgeResult()
        {
            playerHP
                .hp
                .Where(x => x <= 0.0f)
                .Subscribe(_ =>
                {
                    Debug.Log(robotAgent.gameObject.name + "GetReward!");
                    robotAgent.SetReward(0.0f);
                    robotAgent.Done();
                })
                .AddTo(this);

            enemyHP
                .hp
                .Where(x => x <= 0.0f)
                .Subscribe(_ =>
                {
                    Debug.Log(enemyAgent.gameObject.name + "LoseReward");
                    robotAgent.SetReward(1.0f);
                    robotAgent.Done();
                })
                .AddTo(this);
        }
    }
}

クラス図

f:id:alberto_hojo:20190604235647p:plain

今日のパフォーマンス

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

f:id:alberto_hojo:20190604235534p:plain:w250

作業時間 10h29m

集中時間 3h23m

集中率 32%