2DPlatFormar-PlayerController

Last-modified: 2023-05-11 (木) 02:51:49

プログラム

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Platformer.Gameplay;
using static Platformer.Core.Simulation;
using Platformer.Model;
using Platformer.Core;

最初の宣言部分

namespace Platformer.Mechanics

名前空間
public class ○○の宣言を囲ってグループ化している

ChatGPTの解説

namespace(名前空間)は、関連するクラスや型をグループ化するためのC#の機能です。
名前空間は、コードの組織化と分類を支援し、クラス名や型名の衝突を防ぐのに役立ちます。
名前空間は、コード内の識別子(クラス、構造体、インターフェース、列挙型など)に一意の識別子を与えるために使用されます。
名前空間は、namespace キーワードを使用して定義され、階層構造を持つことができます。
例えば、namespace MyProject のように定義することで、MyProject という名前空間内にクラスや型を定義することができます。

名前空間は、コードの可読性を向上させ、クラスや型の一意性を保証するのに役立ちます。
また、外部のクラスやライブラリとの競合を避けるために、異なる名前空間を使用することもできます。

例えば、以下のようなコードを考えてみましょう:

namespace MyProject
{
   class MyClass
   {
       // クラスの定義
   }
}

この場合、MyClass クラスは MyProject という名前空間に属しています。他の場所で同じ名前のクラスを定義する際に、名前空間が異なれば衝突を回避することができます。
名前空間は、大規模なプロジェクトや複数の開発者が共同作業する場合に特に有用です。適切に名前空間を使用することで、コードの組織化、識別子の一意性、コードの再利用性を向上させることができます。

 public class PlayerController : KinematicObject
  {

KinematicObejectを継承

      public AudioClip jumpAudio;
      public AudioClip respawnAudio;
      public AudioClip ouchAudio;
      /// Max horizontal speed of the player.
     //プレイヤーの水平方向の最大速度
      public float maxSpeed = 7;
      /// Initial jump velocity at the start of a jump.
     //ジャンプ開始時の初期ジャンプ速度
      public float jumpTakeOffSpeed = 7;
      public JumpState jumpState = JumpState.Grounded;
      private bool stopJump;
      /*internal new*/ public Collider2D collider2d;
      /*internal new*/ public AudioSource audioSource;
      public Health health;
      public bool controlEnabled = true;
      bool jump;
      Vector2 move;
      SpriteRenderer spriteRenderer;
      internal Animator animator;
      readonly PlatformerModel model = Simulation.GetModel<PlatformerModel>();
      public Bounds Bounds => collider2d.bounds;

いろんな宣言

      void Awake()
      {
          health = GetComponent<Health>();
          audioSource = GetComponent<AudioSource>();
          collider2d = GetComponent<Collider2D>();
          spriteRenderer = GetComponent<SpriteRenderer>();
          animator = GetComponent<Animator>();
      }

最初に実行される

      protected override void Update()
      {
          if (controlEnabled)
          {
              move.x = Input.GetAxis("Horizontal");
              if (jumpState == JumpState.Grounded && Input.GetButtonDown("Jump"))
                  jumpState = JumpState.PrepareToJump;
              else if (Input.GetButtonUp("Jump"))
              {
                  stopJump = true;
                  Schedule<PlayerStopJump>().player = this;
              }
          }
          else
          {
              move.x = 0;
          }
          UpdateJumpState();
          base.Update();
      }

キー入力が行われたらIF文の中身を見る
水平方向の入力でx方向を見る
地上かつジャンプボタンをしたらジャンプ準備状態にする
ジャンプボタンが離されたらsutopJumpをtrueにしてPlayerStopJumoで停止させる。(PlayerStopJumpがどこにあるかはよくわからない)
入力がない場合は横の移動を0にする

上記のコードは、Update メソッドのオーバーライドです。

Update メソッドは Unity のフレームごとに呼び出される特別なメソッドであり、ゲームオブジェクトの状態を更新するために使用されます。

このコードでは、以下の処理が行われています:

controlEnabled が true の場合、プレイヤーの操作が有効であることを意味します。
Input.GetAxis("Horizontal") を使用して水平方向の入力値を取得し、move.x に代入します。これにより、プレイヤーキャラクターが左右に移動します。
jumpState が JumpState.Grounded(地面に接地している状態)であり、Input.GetButtonDown("Jump")(ジャンプボタンが押された瞬間)の場合、jumpState を JumpState.PrepareToJump に変更します。これにより、プレイヤーキャラクターはジャンプの準備状態になります。
Input.GetButtonUp("Jump")(ジャンプボタンが離された瞬間)の場合、stopJump を true に設定し、PlayerStopJump イベントをスケジュールします。このイベントは、ジャンプの停止を処理するために使用されます。
controlEnabled が false の場合、プレイヤーの操作が無効であることを意味し、move.x は 0 に設定されます。
UpdateJumpState メソッドが呼び出されます。このメソッドは、プレイヤーキャラクターのジャンプ状態を更新します。
base.Update() を呼び出すことで、基底クラスの Update メソッドを実行します。基底クラスの Update メソッドは、キャラクターの物理演算や移動の計算など、基本的な更新処理を行います。
このように、Update メソッドをオーバーライドすることで、フレームごとのプレイヤーキャラクターの挙動を制御することができます。

      void UpdateJumpState()
      {
          jump = false;
          switch (jumpState)
          {
              case JumpState.PrepareToJump:
                  jumpState = JumpState.Jumping;
                  jump = true;
                  stopJump = false;
                  break;
              case JumpState.Jumping:
                  if (!IsGrounded)
                  {
                      Schedule<PlayerJumped>().player = this;
                      jumpState = JumpState.InFlight;
                  }
                  break;
              case JumpState.InFlight:
                  if (IsGrounded)
                  {
                      Schedule<PlayerLanded>().player = this;
                      jumpState = JumpState.Landed;
                  }
                  break;
              case JumpState.Landed:
                  jumpState = JumpState.Grounded;
                  break;
          }
      }

ジャンプ準備状態だったらジャンプ状態にしてjumpをtrueにしてstopjumpをfalseにする。
ジャンプ状態だったら地上でない場合にジャンプを行い空中状態にする
空中なら地上の場合に着地状態にする
着地状態なら地上状態にする

      protected override void ComputeVelocity()
      {
          if (jump && IsGrounded)
          {
              velocity.y = jumpTakeOffSpeed * model.jumpModifier;
              jump = false;
          }
          else if (stopJump)
          {
              stopJump = false;
              if (velocity.y > 0)
              {
                  velocity.y = velocity.y * model.jumpDeceleration;
              }
          }
          if (move.x > 0.01f)
              spriteRenderer.flipX = false;
          else if (move.x < -0.01f)
              spriteRenderer.flipX = true;
          animator.SetBool("grounded", IsGrounded);
          animator.SetFloat("velocityX", Mathf.Abs(velocity.x) / maxSpeed);
          targetVelocity = move * maxSpeed;
      }

ジャンプ状態かつ地上ならy速度を入れてjumpをfalseにする
stopjumpのときに上昇中ならjumpDeceleration(0.5f)を掛ける
x方向の速度が+の場合、反転をオフにする
x方向の速度がーの場合、反転する

     public enum JumpState
     {
          Grounded,
         PrepareToJump,
          Jumping,
          InFlight,
        Landed
     }

列挙型。ジャンプの状態に使用している。
地上、準備、ジャンプ、空中、着地

  }