初心者がUnityでなんかしちゃうぞBlog

Unity初心者は、ゲーム開発の夢を見るか?

Unity初心者がクソゲーを作る その3 「プレイヤー作り」

さぁ、作ろう。クソゲーを。

前回までのあらすじ

unity-senpai.hatenablog.com

なんだかんだ壁も作れてステージも簡素なものを作れたご満悦初心者はついにプレイヤーを実装するために動き出すのであった

プレイヤーを作るけど、まず考えたいこと

ゲームを作る上で大切になるのは「視点」じゃないでしょうか。

などなど色々あります。

僕が今回作るのは、ウィザードリィを劣化させまくったダンジョン探索ゲームです。ウィザードリィを遊んだことのある人ならわかりますが、一人称視点(つまりプレイヤー自身の目線)というわけです。 これを実現する方法は色々あるのですが、今回は空のObjectを作ってそこにカメラを追従させるようなやり方で実現してみたいと思います。もしかしたら不具合でるかもしれませんが、その時にまた考えましょう。

プレイヤーを作ろう

f:id:yuu9048:20190120195126p:plain

f:id:yuu9048:20190120195148p:plain

空のObjectを作って、Playerと名付けました。無事にプレイヤーの誕生です。おめでとう、立派なゲームオブジェクトですよ。 さて、とりあえず初期位置にこの子を配置してあげましょう。

f:id:yuu9048:20190120205613p:plain

y軸が0だと地面に埋まっちゃうので少し高めに置いてあげるといいかもしれません。

カメラをつけるぞ

たぶん現在だとカメラはデフォルト位置にあるだけだと思います。これをさっき作ったObjectからの視点に変えていきましょう。 ちなみに、これはチュートリアルで学んだと思われる玉転がしの流用で作ることができます。

unity3d.com

ここは流用してスクリプトをつらつらと書いていきましょう。新しいC#スクリプトを作成しこんなの書いてみました。 思い切りコピペですね。

  public Transform target;  // ターゲットへの参照

  void Update ()
  {
    // 自分の座標にtargetの座標を代入する
    GetComponent<Transform>().position = target.position;
  }

これをメインカメラにアタッチして、インスペクターのところからプレイヤーをアタッチしておきましょう。

f:id:yuu9048:20190120210657p:plain

プレイヤーを動かすぞ

さて、プレイヤーくんを動かすスクリプトを書いていきましょう。今回はシンプルに作っていきます。(シンプルなのしか作れない)

  • ↑キーで前進
  • ↓キーで後退
  • ←キーで左に90度回転
  • →キーで右に90度回転

以上の仕様で作っていきたいと思います。 新しいC#スクリプトを作成します。名前は「PlayerController」とでもしておきましょう。

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

public class PlayerController : MonoBehaviour {

    // Start is called before the first frame update
    void Start() {

    }

    // Update is called once per frame
    void Update() {
       
        if (Input.GetKeyDown(KeyCode.UpArrow)) {
            transform.Translate(0, 0, 10);
        }

        if (Input.GetKeyDown(KeyCode.DownArrow)) {
            transform.Translate(0, 0, -10);
        }

        if (Input.GetKeyDown(KeyCode.LeftArrow)) {
            transform.Rotate(0,-90,0);
        }

        if (Input.GetKeyDown(KeyCode.RightArrow)) {
            transform.Rotate(0, 90, 0);
        }
    }
}

さてここで色々新しい命令文が出てきましたのでササッと見ていきます。

transform.Translate

transformというのはそのObjectの位置とか回転情報の入れ物みたいなものです。 Translateというのは、移動するぜよ的な意味です。引数に(x,y,z)として移動させたい値を入力します。

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

public class PlayerController : MonoBehaviour {

    // Update is called once per frame
    void Update() {
       
        if (Input.GetKeyDown(KeyCode.UpArrow)) {
            transform.Translate(0, 0, 10);
        }

        if (Input.GetKeyDown(KeyCode.DownArrow)) {
            transform.Translate(0, 0, -10);
        }

    }
}

この例だと、矢印の↑キーを押されたらz軸方向に10移動します。 逆に↓キーを押されたらz軸方向に-10移動します。つまり前進と後退を表しています。

transform.Rotate

Rotateはそのまま「回転」とかの意味です。今回は左右キーを押すと90度ずつ回転するのでそれを実現するために入れています。 指定した軸を中心に回転します。

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

public class PlayerController : MonoBehaviour {

    // Update is called once per frame
    void Update() {
       
        if (Input.GetKeyDown(KeyCode.LeftArrow)) {
            transform.Rotate(0,-90,0);
        }

        if (Input.GetKeyDown(KeyCode.RightArrow)) {
            transform.Rotate(0, 90, 0);
        }

    }
}

←キーを押すとy軸に-90度回転します。 →キーを押すとy軸に90度回転します。

スクリプトをアタッチ

一通りかけたのでアタッチしてみましょう!

f:id:yuu9048:20190120213743p:plain

これで空のObjectくん視点でダンジョンを楽しめるようになったはず、早速ゲームを実行して試してみましょう。

f:id:yuu9048:20190120214325p:plain

f:id:yuu9048:20190120214336p:plain

無事に前に動くことができました。さぁ回転も試してみましょう!

f:id:yuu9048:20190120214336p:plain

あれ…? 回転しないぞ…。

(バグ)回転を反映できていない

移動は反映されますが、回転は反映されません。 この原因を探るために「CameraController」のスクリプトを再度開いてみましょう。

  public Transform target;  // ターゲットへの参照

  void Update ()
  {
    // 自分の座標にtargetの座標を代入する
    GetComponent<Transform>().position = target.position;
  }

ソースを見返すと、「position」だけしかObjectに追従していません。
Transformには位置情報や回転などのデータが入っているのですが、positionだけだと回転まではCameraさんに受け渡しができていなかったんですね。

ということで、rotationという回転の情報もCameraに受け渡すようにしてみましょう。

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

public class CameraControl : MonoBehaviour
{
    public Transform target;  // ターゲットへの参照

    void Update() {
        // 自分の座標にtargetの座標を代入する
        GetComponent<Transform>().position = target.position;
        GetComponent<Transform>().rotation = target.rotation;

    }
}

移動が完成(半分ぐらい)

f:id:yuu9048:20190120220453g:plain

移動と回転が実装できました。いっきにゲームっぽくなりましたね(なったよね?) ただし、このままだと当たり判定とかはまったくないので壁を貫通して移動できてしまいます。今後はそういった問題点を潰してよりゲームらしいものにしていきたいと思います。