StrixCloud入門 #2ゲーム機能

Unity

目的

Unityでオンラインマルチプレイを実装するために、StrixCloudを使用しての開発を開始した。前回、最低限度のプレイヤー表示と複数インスタンスからの動作を行ったので、今回はそのプロジェクトをベースに簡易なゲーム機能を実装する。

ゲーム機能作成

ゲーム機能概要

プレイヤーを操作して先にクリア条件のオブジェクトに触れたら勝ち、というルールにする。

プロジェクト作成

  1. 前回のプロジェクトを開く
  2. テキスト表示用のCanvas Panel Text-TextMeshProを作成
  3. Cubeでクリア(勝利)条件となるオブジェクトClearを作成(以降、クリアと表記)
  4. Clearの色がわかりやすくなるようにマテリアルを設定
  5. PlayerとClearのCollider設定を行う
  6. PlayerControllerの変更
  7. ClearControllerの作成
  8. ClearにClearControllerをアタッチ
  9. インスペクタからでアタッチする項目のアタッチ

PlayerController

PlayerControllerにはClearオブジェクトを持たせる変数を追加して、Clearオブジェクトとの接触時に呼び出されるメソッドを作成する。またこの中でisLocalの判定を行っているのは、Clearと接触したPlayerが自分か、自分以外により画面表示を切り替えるため。

PlayerController.cs

using UnityEngine;
using SoftGear.Strix.Unity.Runtime;

public class PlayerController : StrixBehaviour
{
    public GameObject clear;
    float speed = 3.0f;

    void Update()
    {
        if (!isLocal) return;

        if (Input.GetKey(KeyCode.W))
        {
            transform.position += speed * transform.forward * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.S))
        {
            transform.position -= speed * transform.forward * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.D))
        {
            transform.position += speed * transform.right * Time.deltaTime;
        }
        if (Input.GetKey(KeyCode.A))
        {
            transform.position -= speed * transform.right * Time.deltaTime;
        }
    }

    private void OnTriggerEnter(Collider other)
    {
        if (isLocal)
        {
            clear.GetComponent().GameFinish(true);
        }
        else
        {
            clear.GetComponent().GameFinish(false);
        }
        Destroy(other.gameObject);
    }
}

ClearController

ClearControllerはゲーム開始時とPlayerとClearの接触時に表示テキストを変える処理を作成。GameFinish(bool winFlg)というメソッドがコライダー接触時に呼び出される。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SoftGear.Strix.Unity.Runtime;
using TMPro;

public class ClearController : StrixBehaviour
{
    [SerializeField]
    TextMeshProUGUI gameText;
    
    // Start is called before the first frame update
    void Start()
    {
        gameText.text = "In Game";
    }

    public void GameFinish(bool winFlg)
    {
        if(winFlg) gameText.text = "Win";
        else gameText.text = "Lose";
    }
}

動作チェック

目論見通り、clearと接触したplayerの画面には「Win」もう一方のplayerの画面には「Lose」と表示された。

コメント

タイトルとURLをコピーしました