yamada_yoshiki Posted by

おはようございます!こんにちは!こんばんは!おやすみなさい!
山田です。

次回に引き続きUnityを使用してゲームを作っていきたいと思います!!!

今回は前回少しだけ紹介したメインカメラをプレイヤーの動きと連動させていきます。
また、プレイヤーの移動を制限し、ゲーム画面外にプレイヤーが移動しないようにします。

カメラコントローラーを作る

カメラを動かすにはカメラコントローラのスクリプトを作成します。

プロジェクトウィンドウ内でCreate→C# Scriptを選択し、ファイル名を【CameraController】に変更します。

メインカメラの処理を作成

作成した【CameraController】の処理を作成します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour {

  // プレイヤーオブジェクト
  GameObject player;

  void Start() {
    // プレイヤー生成
    this.player = GameObject.Find("player-stand-2");
  }

  void Update() {
    // プレイヤーの位置を取得
    Vector3 playerPos = this.player.transform.position;
    // プレイヤーの位置をカメラに反映
    transform.position = new Vector3(playerPos.x, transform.position.y, transform.position.z);
  }
}

プレイヤーの移動方向にカメラが追従するようにプレイヤーの座標を取得し、カメラの位置に反映させています。

カメラコントロールをアタッチする

作成したカメラコントロールのスクリプトをMain Cameraオブジェクトにドラッグ&ドロップします。

移動範囲の制限

現在プレイヤーの移動範囲の制限がされておらず、地面オブジェクトの端まで行くことが出来るのplayer.csに制限を加えます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class player : MonoBehaviour {
    Rigidbody2D rigid2D;        // 重力オブジェクト
    Animator animator;      // アニメーションオブジェクト
    float jumpForce = 500.0f;   // ジャンプ力
    float walkForce = 20.0f;    // 移動速度
    float maxWalkSpeed = 20.0f; // 最大速度
    bool leftBtn = false;       // 左ボタン押下フラグ
    bool rightBtn = false;      // 右ボタン押下フラグ
    Vector2 playerPos;      // プレイヤー位置
    float maxScreenPos = 190f;  // 画面最大値
    float minScreenPos = -40f;  // 画面最小値

    // スタートメソッド
    void Start() {
        // 各メンバ変数の取得
        this.rigid2D = GetComponent();
        this.animator = GetComponent();
    }

    // アップデートメソッド
    void Update() {
        // 左矢印キー・左ボタンが押されている間
        if (Input.GetKey(KeyCode.LeftArrow) || leftBtn) {
            playerMove(-1, "run");
        }

        // 右矢印キーが右ボタン押されている間
        if (Input.GetKey(KeyCode.RightArrow) || rightBtn) {
            playerMove(1, "run");
        }

        // スペースキーが押された時
        if (Input.GetKeyDown(KeyCode.Space)) {
            playerMove(0, "jump");
        }

        // 『B』キーが押された時
        if (Input.GetKeyDown(KeyCode.B)) {
            playerMove(0, "attack");
        }
        // プレイヤーの位置を取得
        playerPos = transform.position;
        // プレイヤーのX座標が範囲内か監視
        playerPos.x = Mathf.Clamp(playerPos.x, minScreenPos, maxScreenPos);
        // プレイヤーのY座標が範囲内か監視
        playerPos.y = Mathf.Clamp(playerPos.y, -34.6f, 15);
        // 範囲内であればそのままの位置をいれる
        transform.position = new Vector2(playerPos.x, playerPos.y);
        
        // 画面最大値に到着すると画面最小値に移動する
        if (maxScreenPos <= playerPos.x) {
          transform.position = new Vector2(minScreenPos, playerPos.y);
        }
    }

    // プレイヤの移動
    public void playerMove(int key, string mode) {

        switch(mode) {
            case "run":
                // アニメーション
                this.animator.SetTrigger("runTrigger");
                
                // プレイヤの速度
                float speedx = Mathf.Abs(this.rigid2D.velocity.x);

                // スピード制限
                if(speedx < this.maxWalkSpeed) {
                    this.rigid2D.AddForce(transform.right * key * this.walkForce);
                }

                // 動く方向に反転
                if(key != 0) {
                    transform.localScale = new Vector3(key*7, 5, 5);
                }
            break;
            case "jump":
                // アニメーション
                this.animator.SetTrigger("jumpTrigger");
                // 移動方向
                this.rigid2D.AddForce(transform.up * this.jumpForce);
                break;
            case "attack":
                transform.Translate(0, -1, 0);
                break;
        }
    }

    // 左ボタンが押されている時
    public void LButtonDown() {
        leftBtn = true;
    }
    // 左ボタンが押されていない時
    public void LButtonUp() {
        leftBtn = false;
    }
    // 右ボタンが押されている時
    public void RButtonDown() {
        rightBtn = true;
    }
    // 右ボタンが押されていない時
    public void RButtonUp() {
        rightBtn = false;
    }
    // Aボタンが押された時
    public void AButtonDown() {
        playerMove(0, "jump");
    }
    // Bボタンが押された時
    public void BButtonDown() {
        playerMove(0, "attack");
    }
}

プレイヤーの位置常に取得して画面の最大値~最小値の間か監視しています。
画面の最大値~最小値の外であればプレイヤーの位置を現在の位置から動かないように設定してゲーム画面外に出ないようにしています。
また、X座標最大値に到達すると画面の最小値に移動するように設定しているのでユーザーはワープしたように感じる事でしょう。

最後に

今回はメインカメラを使った追随処理と移動制限について紹介しました。

今回のゲームも下記URLから動かすことが可能です。
http://takuan1019.tk/game5