今回は、プレイヤーの攻撃が敵に当たった場合相手にダメージを与えてノックバックさせるという処理を実装します。
攻撃を実装する
まずはパンチの当たり判定を担当するオブジェクトを作ります。
ヒエラルキー上の右クリックし2D Object>Sprites>Squareを作成し、ドラッグしてPlayerの子要素にします。
右クリックからRenameを選び、名前を”Punch”にします。
Transformのposition X -0.5,Y 0.2,Z 0
このままだと白い画像がそのまま表示されているのでSprite Rendererのチェックマークを外してください。
AddComponentでBoxCollider2Dを追加します。
攻撃をする側の記述を書いていきます。
そしてScriptsフォルダにCreate>C#Scriptで”PunchScript”を作成します。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PunchScript : MonoBehaviour { [SerializeField] StatusData statusdata; void Start(){} void Update(){} void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.tag == "Enemy") { other.gameObject.GetComponent<EnemyScript>().Damage(statusdata.ATK); other.gameObject.GetComponent<EnemyScript>().NockBack(statusdata.NockBack); } } }
PlayerStatusのNockBackを4に設定します。
このスクリプトを”Punch”にアタッチします。
この時点ではエラーが出てしまいますが、EnemyScriptにダメージ関数とノックバック関数を実装していきます。
OnTriggerEnter2Dは他のオブジェクトに当たった時に呼び出される関数です。
otherに代入されたゲームオブジェクトのタグがEnemyの場合、相手の持つEnemyScriptの関数を呼び出します。
そしてEnemyScriptの方に攻撃側の数字を受け取って実際にダメージ処理を行う記述をEnemyScriptに書いていきます。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyScript : MonoBehaviour { GameObject Player; Vector3 PlayerPos; [SerializeField] StatusData statusdata; bool MUTEKI;//攻撃を受けるかどうかの切り替えを行う//☑ private float HP; private float currentTime = 0f;//☑ Vector3 diff;//プレイヤーとの距離を測るため //☑ Vector3 vector; private Rigidbody2D rb;//☑ void Start(){ Player = GameObject.FindGameObjectWithTag("Player"); PlayerPos= Player.transform.position; this.transform.LookAt(PlayerPos); HP = statusdata.MAXHP; rb = GetComponent<Rigidbody2D>();//Rigidbody2Dの取得//☑ } void Update(){ ~省略~ if (MUTEKI)//攻撃を受けてから0.2秒後にする処理 { currentTime += Time.deltaTime; if (currentTime > statusdata.SPAN ) { currentTime = 0f; MUTEKI = false;//無敵状態終わらせる rb.velocity = new Vector2(0, 0);//ノックバックをとめる } } if (HP <= 0)//HPが0以下になったら消える { Destroy(this.gameObject); } } public void Damage(float damage) { if (!MUTEKI) {//無敵状態じゃないときに攻撃を受ける HP -= damage;//HP減少 Debug.Log(HP);//現在のHPを表示 MUTEKI = true;//無敵状態にする } } public void NockBack(float nockback){ Vector2 thisPos = transform.position; float distination = thisPos.x - PlayerPos.x;//攻撃を受けて時点での敵キャラとプレイヤーとの位置関係 rb.velocity = new Vector2(distination*nockback, 0);//殴った方向に飛んでいく }
ちょっと長くなりましたが、
・攻撃を受ける時のダメージ関数
・殴られた時のノックバック関数
・時間経過でノックバックを止める機能
・HPが0になった時に消滅させる
というスクリプトです。
Damage関数では無敵状態でない時だけPunchScriptから受け取った引数(PlayerStaus.ATK)を使って現在のHPから攻撃力分を引きます。
そして0.2秒間だけ無敵状態になり、連続で攻撃を受けないようにします。
NockBack関数では(PlayerStaus.NockBack)を受け取り、攻撃を受けた時に後ろにのけぞる表現をします。
distination = thisPos.x - PlayerPos.x;でプレイヤーとの位置関係を取得します。
プレイヤーが敵キャラの右側にいる時はdistinationが負の数になり、左側にいる時はdistinationが正の数になります。
これで飛んでいく方向を決めています。
rb.velocity = new Vector2(distination*nockback, 0);
Rigidbody2Dの変数であるrbに力を加えます。
Damage関数で無敵状態になった時Update関数の中のif(MUTEKI)の中の処理が実行されます。
Enemy1で設定したSPANの数値(0.2秒)が経った時に無敵状態の解除と、ノックバックを止めます。
rb.velocity = new Vector2(0, 0);//ノックバックをとめる
ノックバックを停止しないとそのまま緩やかに遠ざかってしまうので注意しましょう。
保存して実行してみましょう。
パンチが当たった敵が後方にノックバックし、何発かあてたときに消えれば成功です。
次回は攻撃のONとOFFの切り替えとパンチを受けたときのヒットマークを実装していきます。
コメント