弾を発射
メニューを表示するにはスワイプしてください
public class Projectile : MonoBehaviour
{
[SerializeField] int damage;
[SerializeField] float speed;
Rigidbody2D rb;
Vector2 direction;
public void Setup(Vector2 direction)
{
this.direction = direction;
rb = GetComponent<Rigidbody2D>();
transform.right = direction;
Destroy(gameObject, 6);
}
private void Update()
{
rb.velocity = direction * speed;
}
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log(collision.gameObject.name);
if (collision.tag == "Player")
{
if (collision.TryGetComponent(out IGetAttacked getAttacked))
{
getAttacked.GetAttacked(damage);
Destroy(gameObject);
}
}
}
}
Projectile クラスは、敵がプレイヤーに向けて発射するプロジェクタイルの挙動を管理する役割。プロジェクタイルの進行方向や速度の設定、移動の更新、衝突時の処理を担当。
Setup メソッド
public void Setup(Vector2 direction)
{
this.direction = direction;
rb = GetComponent<Rigidbody2D>();
transform.right = direction;
Destroy(gameObject, 6);
}
目的: このメソッドはプロジェクタイルの初期状態を設定。
パラメータ: Vector2 direction パラメータでプロジェクタイルの進行方向を指定。
処理内容: プロジェクタイルの進行方向を設定し、Rigidbody2D コンポーネントを取得、進行方向に回転、6秒後に自動的に削除されるようスケジュール。
Update メソッド
private void Update()
{
rb.velocity = direction * speed;
}
目的:このメソッドはプロジェクタイルの移動を更新します。
動作:指定された方向と速度でプロジェクタイルを移動させるために、Rigidbody2D の速度を設定します。
OnTriggerEnter2D メソッド
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log(collision.gameObject.name);
if (collision.tag == "Player")
{
if (collision.TryGetComponent(out IGetAttacked getAttacked))
{
getAttacked.GetAttacked(damage);
Destroy(gameObject);
}
}
}
目的:このメソッドは他のオブジェクトとの衝突を処理します。
パラメータ:Collider2D collision パラメータを受け取り、衝突を検出します。
動作:プロジェクタイルが衝突したオブジェクトの名前をログに記録し、タグが "Player" の場合、IGetAttacked インターフェースを実装したコンポーネントが存在すれば、その GetAttacked メソッドを呼び出してダメージを与えます。最後に、プレイヤーに当たった後プロジェクタイルを破壊します。
このように実装した理由
モジュール性と再利用性:Projectile クラスは、敵が使用するあらゆる種類のプロジェクタイルに対応できるよう、モジュール化および再利用可能な設計となっています。方向と速度を設定することで、さまざまな挙動を持つプロジェクタイルを作成できます。
効率的な移動処理:移動には Rigidbody2D コンポーネントを使用することで、Unity の物理システムに従った滑らかでリアルな動きを実現しています。
衝突検出とダメージ処理:OnTriggerEnter2D メソッドにより、プロジェクタイルがプレイヤーと衝突した際に適切にダメージを与えることができ、プロジェクタイルとプレイヤー間のインタラクションが効果的になります。
SendProjectileState クラス
public class SendProjectileState : State
{
Animator animator;
System.Action sendProjectileFunc;
public SendProjectileState(Animator animator, System.Action sendProjectileFunc)
{
this.animator = animator;
this.sendProjectileFunc = sendProjectileFunc;
}
public override void StartState()
{
isStateFinished = false;
animator.SetBool("projectil", true);
}
public override void StartAction()
{
sendProjectileFunc();
}
public override void EndState()
{
animator.SetBool("projectil", false);
}
}
SendProjectileState クラスは、敵が飛び道具を発射する際の挙動を管理する特定のステート。State クラスを継承し、飛び道具攻撃アクションの開始、終了、実行を行うメソッドを含む。
コンストラクタ
コンストラクタはSendProjectileStateを、アニメーション用のAnimatorと飛び道具を発射するアクションで初期化し、対応するメンバ変数に設定する。
StartState メソッド
このメソッドは isStateFinished を false に設定し、アニメーター内の "projectil" ブールパラメータを true に設定することで、飛び道具アニメーションを開始します。
StartAction メソッド
このメソッドは sendProjectileFunc を呼び出し、飛び道具を発射するために定義されたアクションを実行します。通常、このメソッドはアニメーターイベントによって呼び出され、アニメーションと飛び道具の発射を同期させます。
EndState メソッド
このメソッドはアニメーター内の "projectil" ブールパラメータを false に設定することで、飛び道具アニメーションを停止します。
この方法を選んだ理由
モジュール化と再利用性:
SendProjectileState クラスはモジュール化されており、System.Action を利用することでさまざまな弾発射動作を柔軟に統合可能。
アニメーションとの連携: アニメーターのパラメーターを使用することで、弾の発射が対応するアニメーションと同期し、滑らかでリアルな体験を実現。
弾発射関数
void SendProjectile()
{
Vector2 direction = (player.position - transform.position).normalized;
Instantiate(projectile, projectileSendingPosition.position, Quaternion.identity).Setup(direction);
}
SendProjectile メソッドは、プレイヤーに向かって弾を生成し発射する役割。敵からプレイヤーへの方向を計算し、弾を生成して、その方向に進むように設定。
メソッド定義とコンポーネント
メソッド定義:
void SendProjectile(): 戻り値のないメソッドで、飛び道具の発射処理を担当。
コンポーネント:
Vector2 direction = (player.position - transform.position).normalized;
この行は、敵からプレイヤーへの方向を計算。敵の位置をプレイヤーの位置から引き、その結果を正規化(.normalized)することで、長さ1の単位ベクトルとして方向のみを示す。
Instantiate(projectile, projectileSendingPosition.position, Quaternion.identity).Setup(direction);
この行は、指定した位置(projectileSendingPosition.position)に回転なし(Quaternion.identity)で新しい飛び道具のインスタンスを生成。生成した飛び道具に対してSetupメソッドを呼び出し、方向を設定する。
Unityアニメーターとの連携
StartAction関数はアニメーターイベントを利用して呼び出し。これにより、敵のアニメーション内で飛び道具を発射したい正確なフレームを指定可能。アニメーションは多数のフレームで構成されているため、このアクションを実行する正確なタイミングを特定することが重要。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください