前回までで自機と敵の弾を動かすことができました。
今回は自機と敵の弾との当たり判定を組み込みたいと思います。
まず、敵弾の中心座標と自機の中心座標との距離を求める。
これをkyoriとする。
次に
敵弾の半径をrEとする。
自機の半径をrSとする。
kyori < rE + rS の時、敵弾と自機は衝突しているらしい。
1.最初に自機(ship1)オブジェクト情報にアクセスするゲームオブジェクト型変数、playerを宣言。
GameObject player;
2.スタート関数内でship1オブジェクトを見つけてplayerに代入、実体化。
this.player = GameObject.Find ("ship1");
3.アップデート関数内で
敵弾座標をposEに代入
Vector2 posE = transform.position;
自機座標をposSに代入
Vector2 posS = this.player.transform.position;
4.自機から敵弾に向かうベクトルdirを計算
Vector2 dir = posE - posS;
5.ベクトルdirの長さを求めてkyoriに代入。
float kyori = dir.magnitude;
6.
敵弾の半径を0.1に設定
float rE = 0.1f;
自機の半径を0.5に設定
float rS = 0.5f;
この値を変えると当たり判定を大きくしたり小さくしたりできる。
7.敵弾半径(rE)と自機半径(rS)を足したものより
ベクトルdirの長さ(kyori)が小さいと衝突してるので
衝突してたら敵弾を消す。
if (kyori < rE + rS) {
Destroy (gameObject);
}
8.書けたら保存して実行してみる。
↓
ちゃんと当たったら敵の弾が消えてて正常に当たり判定できている模様。
やったー ^^v
///////////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Esmove : MonoBehaviour {
float esx = 0; //敵弾のx方向を入れる変数を宣言。
GameObject player; //ship1オブジェクト情報にアクセスするゲームオブジェクト型変数、playerを宣言。
// Use this for initialization
void Start () {
//↓ここでfloat esx = ... としてしまうと下のtransform.Translate に反映されない!苦しんだ俺!
this.esx = Random.Range (-0.03f, 0.03f); //敵弾のx方向の軌道をランダムに決める
this.player = GameObject.Find ("ship1"); //ship1オブジェクトを見つけてplayerに代入、実体化。
}
// Update is called once per frame
void Update () {
//transform.Translate (this.esx, -0.1f, 0); //敵弾を動かす処理
transform.Translate (this.esx, -0.01f, 0); //敵弾を動かす処理
if (transform.position.y < -5.0f) { //画面下に消えると弾オブジェクトを消す
Destroy (gameObject);
}
//当たり判定
Vector2 posE = transform.position; //敵弾座標をposEに代入
Vector2 posS = this.player.transform.position; //自機座標をposSに代入
Vector2 dir = posE - posS; //自機から敵弾に向かうベクトルdirを計算
float kyori = dir.magnitude; //ベクトルdirの長さを求めてkyoriに代入。
float rE = 0.1f; //敵弾の半径を0.1に設定
float rS = 0.5f; //自機の半径を0.5に設定
if (kyori < rE + rS) { //敵弾半径と自機半径を足したものよりベクトルdirの長さが小さいと衝突してる
Destroy (gameObject); //衝突してたら敵弾を消す
}
}
}
///////////////////////////////////////////
ー広告ー