Unity で近接戦闘システムを作成する

ゲームにおける近接戦闘とは、プレイヤーが武器や自分の体を使って敵を攻撃する近距離戦闘を指します。 このタイプの戦闘は、アクションアドベンチャー、ロールプレイング、格闘ゲームなど、多くのゲームジャンルで重要です。 近接戦闘システムはゲームプレイに深みを加え、遠距離戦闘とは異なる直感的で没入感のある体験をプレイヤーに提供します。 Unity で近接戦闘システムを実装するには、スクリプト、アニメーション、衝突検出が含まれ、スムーズで応答性の高い戦闘メカニクスが保証されます。

この記事では、初心者に適した、Unity での基本的な近接戦闘システムを作成する手順を説明します。プレイヤー キャラクターの設定、近接攻撃アニメーションの作成、攻撃ロジックのスクリプト化、ヒットを登録するための衝突検出の実装について説明します。

ゲームにおける近接戦闘の重要性

近接戦闘は、いくつかの理由から、特定の種類のゲームでは不可欠です。

  • 没入型ゲームプレイ: 近接戦闘により、緊迫感と魅力あふれるゲームプレイ体験が生まれ、プレイヤーはアクションへの没入感を高めることができます。
  • 多様性: 主に遠距離戦闘を特徴とするゲームに近接戦闘を追加すると、多様性が生まれ、ゲームプレイが新鮮で興味深いものになります。
  • キャラクターと世界構築: 近接戦闘はキャラクターの能力とゲームの設定を反映し、全体的な物語と世界構築を強化します。
  • 戦略の深さ: プレイヤーは位置取り、タイミング、武器の選択を考慮する必要があり、ゲームプレイに戦略の層が追加されます。

プレイヤーキャラクターの設定

  1. 新しいプロジェクトを作成する: Unity を開いて、新しい 3D プロジェクトを作成します。
  2. プレイヤー キャラクターを追加します: プレイヤー キャラクターの 3D モデルをインポートまたは作成します。必要に応じて、Unity Asset Store から無料のアセットを使用できます。
  3. Animator Controller を設定する: プレイヤーのアニメーションを処理する Animator Controller を作成します。必要なアニメーション (アイドル、歩行、攻撃) をインポートし、アニメーションの状態と遷移を設定します。

近接攻撃アニメーションの作成

  1. 攻撃アニメーションをインポート:
    • キャラクターの攻撃アニメーションをダウンロードまたは作成します。
    • これらのアニメーションを Unity にインポートし、Animator コントローラーに追加します。
  2. アニメーショントランジションを設定する:
    • Animator コントローラーで、アイドル、歩行、攻撃の各状態間の遷移を作成します。
    • これらの遷移を制御するには、'isAttacking' などのパラメータを使用します。

攻撃ロジックのスクリプト作成

攻撃アニメーションのトリガーやヒットの検出など、プレイヤーの近接攻撃ロジックを処理する C# スクリプトを作成します。

  1. 新しいスクリプトを作成する:
    • プロジェクト ウィンドウを右クリックし、'Create -> C# Script' を選択して、'PlayerCombat' という名前を付けます。
  2. スクリプトの実装:
    • スクリプトをダブルクリックして、任意のコード エディター (Visual Studio Code など) で開きます。
    using UnityEngine;
    
    public class PlayerCombat : MonoBehaviour
    {
        public Animator animator;
        public Transform attackPoint;
        public float attackRange = 0.5f;
        public LayerMask enemyLayers;
        public int attackDamage = 40;
        public float attackRate = 2f;
        private float nextAttackTime = 0f;
    
        void Update()
        {
            if (Time.time >= nextAttackTime)
            {
                if (Input.GetButtonDown("Fire1"))
                {
                    Attack();
                    nextAttackTime = Time.time + 1f / attackRate;
                }
            }
        }
    
        void Attack()
        {
            animator.SetTrigger("Attack");
    
            // Detect enemies in range of the attack
            Collider[] hitEnemies = Physics.OverlapSphere(attackPoint.position, attackRange, enemyLayers);
    
            // Damage them
            foreach (Collider enemy in hitEnemies)
            {
                enemy.GetComponent().TakeDamage(attackDamage);
            }
        }
    
        void OnDrawGizmosSelected()
        {
            if (attackPoint == null)
                return;
    
            Gizmos.DrawWireSphere(attackPoint.position, attackRange);
        }
    }
  3. スクリプトの割り当て:
    • 'PlayerCombat' スクリプトをプレイヤー キャラクターに添付します。
    • インスペクターで 'Animator''Attack Point' などのフィールドを設定します。

敵のロジックを実装する

  1. 敵のスクリプトを作成する:
    • プロジェクト ウィンドウを右クリックし、'Create -> C# Script' を選択して、'Enemy' という名前を付けます。
    • スクリプトをダブルクリックして、任意のコード エディターで開きます。
    using UnityEngine;
    
    public class Enemy : MonoBehaviour
    {
        public int maxHealth = 100;
        int currentHealth;
    
        void Start()
        {
            currentHealth = maxHealth;
        }
    
        public void TakeDamage(int damage)
        {
            currentHealth -= damage;
    
            if (currentHealth <= 0)
            {
                Die();
            }
        }
    
        void Die()
        {
            // Add death animation or effects
            Destroy(gameObject);
        }
    }
  2. スクリプトの割り当て:
    • 'Enemy' スクリプトを敵オブジェクトに添付します。

視覚的および音声的なフィードバックの追加

視覚と音声のフィードバックによって近接戦闘体験を強化することは、プレイヤーの満足度を高めるために重要です。その方法は次のとおりです。

  1. ヒットエフェクトを追加する:
    • 攻撃が敵に当たったときのパーティクル エフェクトを作成します。
    • 敵に攻撃が当たったときに、'Attack' メソッドでこれらのエフェクトをインスタンス化します。
  2. サウンドエフェクトを追加する:
    • 攻撃やヒットの衝撃のサウンドエフェクトをインポートします。
    • 攻撃中や敵に攻撃されたときにこれらのサウンドを再生するには、'AudioSource' コンポーネントを使用します。
    using UnityEngine;
    
    public class PlayerCombat : MonoBehaviour
    {
        public Animator animator;
        public Transform attackPoint;
        public float attackRange = 0.5f;
        public LayerMask enemyLayers;
        public int attackDamage = 40;
        public float attackRate = 2f;
        private float nextAttackTime = 0f;
        public AudioClip attackSound;
        public AudioClip hitSound;
        private AudioSource audioSource;
        public GameObject hitEffect;
    
        void Start()
        {
            audioSource = GetComponent();
        }
    
        void Update()
        {
            if (Time.time >= nextAttackTime)
            {
                if (Input.GetButtonDown("Fire1"))
                {
                    Attack();
                    nextAttackTime = Time.time + 1f / attackRate;
                }
            }
        }
    
        void Attack()
        {
            animator.SetTrigger("Attack");
            audioSource.PlayOneShot(attackSound);
    
            // Detect enemies in range of the attack
            Collider[] hitEnemies = Physics.OverlapSphere(attackPoint.position, attackRange, enemyLayers);
    
            // Damage them and play hit effect
            foreach (Collider enemy in hitEnemies)
            {
                enemy.GetComponent().TakeDamage(attackDamage);
                audioSource.PlayOneShot(hitSound);
                Instantiate(hitEffect, enemy.transform.position, Quaternion.identity);
            }
        }
    
        void OnDrawGizmosSelected()
        {
            if (attackPoint == null)
                return;
    
            Gizmos.DrawWireSphere(attackPoint.position, attackRange);
        }
    }

結論

Unity に近接戦闘システムを実装すると、特に近接戦闘が不可欠なジャンルでは、ゲームプレイ体験を大幅に向上させることができます。このガイドに従うことで、アニメーション、攻撃ロジック、衝突検出を備えた基本的な近接戦闘システムを作成できます。Unity に慣れてきたら、ニーズに合わせてシステムをさらに改良することができます。