プレイヤーキャラの作り方3:プレイヤーのC#スクリプトの作成

前回まででユニティちゃんを動かすための準備が一通りできたので、今回はC#スクリプトを書いて実際にユニティちゃんを動かせるようにします。

スポンサーリンク

BaseCharacterController.csの変更

ではプレイヤーのC#スクリプトを書く前に、まずは「くろくま基本アセット」に含まれているキャラクター用の基底クラス「BaseCharacterController」を少し変更します。

変更後のスクリプトは次の通りです(※関係ない部分は適当に省略してあります)。

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

public class BaseCharacterController : MonoBehaviour
{
  public bool isActive = false; 

  [SerializeField]
  protected int maxHP = 1;
  [SerializeField]
  protected float defaultSpeed = 0;
  [SerializeField]
  protected int defaultPower = 0;
  //ここから追加
  [SerializeField]
  protected float jumpPower = 0;
  [SerializeField]
  protected GameObject[] groundCheckObjects = new GameObject[3];

  protected int hp = 0;
  protected float speed = 0;
  protected int power = 0;
  protected GameObject gameManagerObj;
  protected GameManager gameManager;
  //ここから追加
  protected bool isGrounded = false;
  protected bool isGroundedPrev = false;
  protected float direction = 1;

  //省略

  protected virtual void InitCharacter()
  {
    Hp = maxHP;
    Speed = defaultSpeed;
    direction = transform.localScale.x; //追加

    isActive = true;
  }

  //省略

  protected virtual void Dead()
  {

  }

  //ここから追加
  protected virtual void UpdateAnimation()
  {

  }

  protected void GroundCheck()
  {
    isGroundedPrev = isGrounded;

    Collider2D[] groundCheckCollider = new Collider2D[groundCheckObjects.Length];

    //接地判定オブジェクトが何かに重なっているかどうかをチェック
    for(int i = 0; i < groundCheckObjects.Length; i++)
    {
      groundCheckCollider[i] = Physics2D.OverlapPoint(groundCheckObjects[i].transform.position);

      //接地判定オブジェクトのうち、1つでも何かに重なっていたら接地しているものとして終了
      if(groundCheckCollider[i] != null)
      {
        isGrounded = true;

        return;
      }
    }

    //ここまできたということは何も重なっていないということなので、接地していないと判断する
    isGrounded = false;
  }

}

変更内容の解説

初期状態では2Dアクションゲーム用の処理になっていないので、必要なメソッドやフィールドを少し追加しました。

追加した接地判定用のGroundCheckメソッドでは、

  1. ユニティちゃんのゲームオブジェクトの作成」で用意してもらった接地判定用オブジェクトのTransformを利用し、OverlapPointメソッドで接地判定オブジェクトが何か別のコライダーに重なっているかどうかをチェック
  2. 3つの接地判定オブジェクトのうち、1つでも何かに重なっていたら接地とし、そうでなかったら空中にいると判定

というような処理を行っています。

プレイヤー用スクリプトの作成

さて、そうしたら次はいよいよプレイヤー用のC#スクリプトを書いていきます。「Scripts」フォルダ内に新しいC#スクリプトを作り、名前を「PlayerController」に変更して次のスクリプトを書いてください。

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

[RequireComponent(typeof(Rigidbody2D))]
[RequireComponent(typeof(SpriteRenderer))]
[RequireComponent(typeof(Animator))]
public class PlayerController : BaseCharacterController
{

  [SerializeField]
  string horizontalInputName = "Horizontal";
  [SerializeField]
  string jumpButtonName = "Jump";

  bool jump = false;
  bool damage = false;
  float inputH = 0;
  Animator animator;
  SpriteRenderer spriteRenderer;
  Rigidbody2D rigidBody2D;

  protected override void Start()
  {
    base.Start();

    animator = GetComponent<Animator>();
    spriteRenderer = GetComponent<SpriteRenderer>();
    rigidBody2D = GetComponent<Rigidbody2D>();
  }

  protected override void Update()
  {
    GetInput();
  }

  protected override void FixedUpdate()
  {
    Move();
  }

  void GetInput()
  {
    if (!isActive)
    {
      return;
    }

    inputH = Input.GetAxisRaw(horizontalInputName);
    jump = Input.GetButtonDown(jumpButtonName);
  }

  protected override void Move()
  {
    if (!isActive)
    {
      return;
    }

    //接地判定
    GroundCheck();

    //移動速度の計算処理
    if (inputH != 0)
    {
      direction = Mathf.Sign(inputH);
      speed = defaultSpeed * direction;

      //入力がマイナスならスプライトの向きを反転させる
      spriteRenderer.flipX = direction < 0 ? true : false;
    }
    else
    {
      speed = 0;
    }

    //ジャンプの速度計算
    if (jump && isGrounded)
    {
      rigidBody2D.velocity = Vector3.up * jumpPower;
    }

    //アニメーションを更新
    UpdateAnimation();

    //実際の移動処理
    rigidBody2D.velocity = new Vector2(speed, rigidBody2D.velocity.y);
  }
    

  protected override void Damage()
  {
    
  }

  protected override void Dead()
  {
    isActive = false;


  }

  protected override void UpdateAnimation()
  {
    animator.SetFloat("Speed", Mathf.Abs(speed));
    animator.SetBool("Jump", !isGrounded);
  }

}

プレイヤー用スクリプトの解説

GetInputメソッド

ここではプレイヤーの入力を受け付けます。入力を扱うので、Updateメソッドから呼び出してフレームごとに毎回値を更新します。

Moveメソッド

ユニティちゃんの移動処理を行います。こちらは物理演算を扱うのでFixedUpdateメソッドから呼び出します。

Damageメソッド、Deadメソッド

まだ何も書いていません。また後で実装します。

UpdateAnimationメソッド

アニメーターコントローラーのパラメーターを更新してアニメーションの遷移を行います。

スクリプトのアタッチ&設定

スクリプトが書けたらPlayerオブジェクトにアタッチして次のように設定を行いましょう。

PlayerControllerの設定

「有効にする」にとりあえずチェックをして、SpeedとJumpPowerを設定し、接地判定用オブジェクトを登録してください。

ユニティちゃんの動作を確認してみよう

ここまでできたら、実際にテストプレイしてちゃんと動くかどうかを確かめてみてください。下の動画のように動けば成功です。

ユニティちゃんの実際の動き

(動いていない場合はクリックで再生)


次のページ→敵キャラクター&ダメージ処理の作り方