攻撃にこだわりたい
ゲームを作っているとプレイヤーや敵の攻撃をそれっぽいものにしたくなりますよね。ゲームでは、攻撃が見どころだったりもします。
今回は、そんな攻撃の中でも代表的な「ホーミング弾」を作っていきたいと思います。
今回のホーミング弾のスクリプトは「くろくまそふと」のくろくまさんのサイトから引用させていただきました。今回のスクリプトの細かな説明をこちらのサイトでされているので是非ともチェックをしてみてください。【Unity】追尾弾(誘導ミサイル)の作り方!必ず命中する弾を実装してみようUnityでシューティングゲーム等を作っていると、例えば 敵を追尾するミサイル を実装したくなることがあります。ただこのような追尾弾は意外と作るのが難しいので、初心者の方にとってはなかなか実装しづらいのではないでしょうか。 そこでここではな
ホーミング弾を動かせるようにする
では、弾になるオブジェクトを用意します。今回僕が使うのは、アセットストアにある「Stones and buried treasure」の中のクリスタルを使用します。
Stones and buried treasure | 3D Fantasy | Unity Asset StoreElevate your workflow with the Stones and buried treasure asset from Comeback. Find this & other Fantasy options on the ...
まずはホーミング弾のスクリプトを書きます。
using System.Collections;
using UnityEngine;
public class CrystalController : MonoBehaviour
{
[SerializeField] Transform target;
[SerializeField, Min(0)] float time = 1;
[SerializeField] bool limitAcceleration = false;
[SerializeField, Min(0)] float maxAcceleration = 100;
[SerializeField] Vector3 minInitVelocity;
[SerializeField] Vector3 maxInitVelocity;
Vector3 position;
Vector3 velocity;
Vector3 acceleration;
Transform thisTransform;
public Transform Target
{
set
{
target = value;
}
get
{
return target;
}
}
void Start()
{
thisTransform = transform;
position = thisTransform.position;
velocity = new Vector3(Random.Range(minInitVelocity.x, maxInitVelocity.x), Random.Range(minInitVelocity.y, maxInitVelocity.y), Random.Range(minInitVelocity.z, maxInitVelocity.z));
}
public void Update()
{
if (target == null)
{
return;
}
acceleration = 2f / (time * time) * (target.position - position - time * velocity);
if (limitAcceleration && acceleration.sqrMagnitude > maxAcceleration * maxAcceleration)
{
acceleration = acceleration.normalized * maxAcceleration;
}
time -= Time.deltaTime;
if (time < 0f)
{
return;
}
velocity += acceleration * Time.deltaTime;
position += velocity * Time.deltaTime;
thisTransform.position = position;
thisTransform.rotation = Quaternion.LookRotation(velocity);
}
}
次にスクリプトをオブジェクトにアタッチします。
スクリプトの項目を見てみましょう。
Targetという項目の中にホーミングするターゲットになるオブジェクトを入れます。
そうすると
このようにスクリプトをアタッチしたオブジェクトがターゲットに向かって飛ぶようになりました!
たくさん生成してみる
次は、ホーミング弾をいっぱい生成するようにしてみます。
まず、最初に先ほど作ったホーミング弾をプレハブ化し、シーン上のものは削除させておきましょう。
生成スクリプトを書いてみましょう。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CrystalSpawner : MonoBehaviour
{
[SerializeField] GameObject Crystal;
[SerializeField, Min(1)] int iterationCount;
[SerializeField] float interval = 0.1f;
WaitForSeconds intervalWait;
float destroyTime = 0;
void Start()
{
intervalWait = new WaitForSeconds(interval);
StartCoroutine("CrystalSpawn");
}
void Update()
{
destroyTime += Time.deltaTime;
if (destroyTime > 6.0f)
{
Destroy(this.gameObject);
}
}
IEnumerator CrystalSpawn()
{
for (int i = 0; i < iterationCount; i++)
{
yield return intervalWait;
Instantiate(Crystal, new Vector3(0, 5, 12), Quaternion.identity).GetComponent<CrystalController>();
}
}
}
このスクリプトで注意をしてもらいたいのが、instantiateの引数new Vector3です。このnew Vector3でオブジェクトを生成したい位置を入れてください。
ヒエラルキーウィンドウで空のオブジェクトを作り、そこに生成スクリプトをアタッチします。
スクリプトの項目の中に生成するオブジェクトを入れる項目(僕の場合はCrystal)があるので、そこに先ほどプレハブ化したオブジェクトを入れましょう。
ここで注目をしてもらいたいのが、Iteration CountとIntervalです。
Iteration Countでは、生成するオブジェクトの個数を指定します。
Intervalでは、生成する間隔のことです。
つまり、僕のを見本にすると「0.6秒間隔で五個の弾を生成する」ということになります。
実行をするとこんな感じになります。
んん…確かにホーミングして的に向かってはいるけど、何か物足りないですね。
ここで、弾の方に戻ってみましょう。
注目をしてほしいのが、弾にアタッチしたスクリプトの中にある Min Init VelocityとMax Init Velocityです。
この項目では「弾に加える各座標軸での初速度の大きさ」を変えることができます。
Min Init Velocityでは最大速度、 Min Init Velocityでは最小速度ですね。
例えば、x軸に最大速度が10の速度、最小速度が-10の速度。
y軸に最大速度が10の速度,最小速度が-10の速度を設定しますと
こんな感じで、よく見るカーブ付きのホーミング弾になりました!
カーブを大きくしたい場合も、初速度の大きさを大きくすれば大丈夫です!
まとめ
いかがだったでしょうか?
ホーミング弾を使えば、僕たちが普段見ているゲームの攻撃のような物になりますね。
これを敵とかに打たせてみたりするのを別の記事で説明をしたいと思います。
今回のホーミング弾のスクリプトは「くろくまそふと」のくろくまさんのサイトから引用させていただきました。今回のスクリプトの細かな説明をこちらのサイトでされているので是非ともチェックをしてみてください。【Unity】追尾弾(誘導ミサイル)の作り方!必ず命中する弾を実装してみようUnityでシューティングゲーム等を作っていると、例えば 敵を追尾するミサイル を実装したくなることがあります。ただこのような追尾弾は意外と作るのが難しいので、初心者の方にとってはなかなか実装しづらいのではないでしょうか。 そこでここではな
コメント