アウトドアとかゲーム開発とか

ロードバイクやキャンプなどアウトドアとUnityでの開発とか

【Unity】放物線を描く射撃をする②

前回の続きの実装編。とりあえずある程度できたのでメモ。
f:id:vrcycling:20180116225308p:plain
↑黄色が放物線の予測線で赤が実際の弾

ただし今回は計算式は使っていないので処理が重かったり融通が利きづらいかも。
ひとまず動いたのでしばらくはこれで、後で修正するかも。

弾の挙動

しばらく(1秒間)まっすぐに飛んで、落下する。

void Update () 
{
	transform.position += transform.forward * Time.deltaTime * speed;		//弾を前進させる
	timer += Time.deltaTime;
	if(timer > 1)
	{
		transform.position += Vector3.up * Time.deltaTime * (1 - timer) * speed;
	}
}

予測線の表示

一定間隔で軌道上にオブジェクトを配置する。

float _interval = 0.02f;	//表示する間隔
Vector3 beforePosition = transform.position;
float timer = 0;

for(int i=0;i<200;i++)
{
	_bullets[i].transform.position = transform.position;
	_bullets[i].transform.rotation = transform.rotation;
	
	//弾を前進させる
	_bullets[i].transform.position = beforePosition + (_bullets[i].transform.forward * _interval * 200);
	timer += _interval;
	if(timer > 1)
	{
		_bullets[i].transform.position = _bullets[i].transform.position + (Vector3.up * (1 - timer) * 200 * _interval);
	}
	
	beforePosition = _bullets[i].transform.position;
}

ベストな角度の取得

ここが結構力業。
上のコードを一定の範囲の角度を1度ずつ変えて、
予測線上のオブジェクトの中から最もターゲットに近いオブジェクトの角度を取得している。
なので角度の範囲が広がれば処理は重くなる。

float bestAngle = 0;
float minDistance = Mathf.Infinity;

//角度を徐々に変えて一番近くに到達する角度をはじき出す
for(int i=360; i>315; i-=1)
{
	transform.localEulerAngles = new Vector3(i, transform.localEulerAngles.y, 0);

	★上記の予測線のコード
	
	foreach(GameObject gos in _bullets)
	{
		float dist = Vector3.Distance(target.position, gos.transform.position);
		if(dist < minDistance)
		{
			minDistance = dist;
			bestAngle = i;
		}
	}
}

transform.localEulerAngles = new Vector3(bestAngle, transform.localEulerAngles.y, 0);

ちなみに予測線は確認用に表示するだけで実際は表示しない。
ひとまずここまで。
よいこのみんなはちゃんとけいさんしような。