それではいよいよゲームプログラミングの作業に取り掛かります。プログラミング経験の浅い方にとってはここが一番難しいところだと思いますが、慣れると一番楽しい部分でもあります。ぜひ一つ一つ丁寧にプログラムを追ってみてください。
目次
C#スクリプトファイルの作成
まずはスクリプトファイルを作成します。「Scripts」フォルダを右クリックし、「Create」→「C# Script」を選択してください。そうすると新しいスクリプトファイルが作成されますので、名前を「Player」に変更します。あとはこのファイルをMonodevelopやVisualStudioで開いて編集しましょう。
プレイヤーキャラクターのプログラム
はじめにプログラムの全文を掲載します。コピー&ペーストしていただいてもいいですし、これを参考にしながらご自分で打ち込んでみてもいいでしょう。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { //インスペクタに表示する変数 [SerializeField] float speed = 0.0f; [SerializeField] float jumpPower = 30.0f; [SerializeField] Transform groundCheck; //インスペクタには表示しない変数 bool jumped = false; bool grounded = false; bool groundedPrev = false; Animator animator; Rigidbody2D rigidBody2D; //初期化 void Start () { //コンポーネントを取得 animator = GetComponent<Animator>(); rigidBody2D = GetComponent<Rigidbody2D>(); } //毎フレームの処理(一般) void Update() { //接地チェック //GroundCheckオブジェクトに床などが重なってるならtrue grounded = (Physics2D.OverlapPoint(groundCheck.position) != null) ? true : false; //接地してるかどうかの分岐 if (grounded) { //接地しているならジャンプを許可 if (Input.GetMouseButtonDown(0)) { Jump(); } } //ジャンプしてるかどうかの分岐 if (jumped) { animator.SetTrigger("Jump"); //ジャンプ終了(前フレームで接地してなくて、今のフレームで接地したとき) if (!groundedPrev & grounded) { jumped = false; } } else { animator.SetTrigger("Dash"); } //このフレームの接地状態を保存 groundedPrev = grounded ? true : false; } //毎フレームの処理(物理演算) void FixedUpdate() { } //ジャンプ void Jump() { jumped = true; rigidBody2D.velocity = Vector2.up * jumpPower; } }
なお、これで完成ではなくまだ手を加える部分はあるのですが、その辺は説明の都合がありますので後で追加するかたちで説明します。
プログラムの解説
それではプログラムを追って意味を確認していきましょう。
インスペクタに表示する変数
まずは変数を宣言します。
- speed:プレイヤーの横移動のスピード
- jumpPower:プレイヤーのジャンプ力
- groundCheck:GroundCheckオブジェクト取得用
ここで変数の前に「[SerializeField]」というおまじないを書いておくと、privateな変数でもインスペクタに表示させることができますので、インスペクタに表示させたい変数にはこれをつけておきます。
「じゃあpublicでもいいんじゃないの?」と思われるかもしれませんが、publicな変数だと他のスクリプトからいじることができてしまうという問題があります。今回宣言した変数はプレイヤーキャラの中だけで使うのでpublicにするメリットはあまりありません。そこで「他のスクリプトからいじる必要はないが、インスペクタから手軽に数値を変更したい変数」に関してはSerializeFieldをつけるのです。
インスペクタには表示しない変数
こちらは普通のprivateな変数として宣言します。
- jumped:ジャンプしたかどうか
- grounded:接地しているかどうか
- groundedPrev:前のフレームで接地したかどうか
- animator:Animatorコンポーネント取得用
- rigidBody2D:Rigidbody2D取得用
初期化部分
PlayerオブジェクトにつけられているAnimatorコンポーネントとRigidbody2Dコンポーネントを取得します。このように最初に取得しておくことで、あとでいちいち取得する必要がなくなります。
毎フレームの処理(一般)
Updateメソッド内では毎フレームの処理を行います。ここがメインの処理でミソの部分ですね。ちょっと難しい処理を行っています。
接地チェック
まず、プレイヤーキャラが設置しているかどうかを取得して変数groundedに保存します。ここでPhysics2D.OverlapPointを使い、ある点がほかのオブジェクトに重なっているかどうかを判定しています。つまり、34行目は「GroundCheckの位置に何もなくない(=なにかある)ならgroundedはtrue、そうじゃないならfalse」という意味です。
接地しているかどうかの分岐
接地していて、かつ左クリックが押されたらジャンプさせます。
ジャンプしているかどうかの分岐
ジャンプ中ならアニメーションのトリガーをJumpにして、ジャンプ中のアニメを再生します。もし前のフレームで接地していなくて(ジャンプ中で)、かつこのフレームで接地したならジャンプを終了させます。
また、ジャンプ中でないならアニメーションのトリガーをDashにして、ダッシュ中のアニメーションを再生します。
このフレームの接地状態を保存
接地状態を保存しておきます。なぜこんなことをするのかというと、ジャンプを始めたときはGroundCheckが床と重なっている状態なので、これがないと即座にジャンプ終了だと判定されてしまうからです。
毎フレームの処理(物理演算)
FixedUpdateメソッド内では物理演算の処理を実行します。ここではまだ何も書かなくてOKです。
ジャンプ
ジャンプ処理を行います。ジャンプ中であることを示すjumpedをtrueにして、上方向にjumpPower分の速度を与えます。
Playerスクリプトコンポーネントの設定
スクリプトが書けたら、最後にPlayerオブジェクトにこのスクリプトのコンポーネントをつけて設定を行います。下記のように「Jump Power」を「30」にして、「Ground Check」に「GroundCheck」オブジェクトをドラッグ&ドロップしてください。
これでひとまずプレイヤーキャラクターが動くようになりました!テストプレイして下の動画のように動けば成功です。
次のページ→ステージの基礎を作る