範囲攻撃は突き抜けるので、縦に並んでいる敵には有利ですね。
最後は、ダブルノックアウトw
assetStoreのこのパーティクルエフェクトを買いました。
Pinwheel Fantasy Effect
https://www.assetstore.unity3d.com/jp/#!/content/50310
ドキュメントを見ると、作者はベトナムの方でした。
30種類ぐらい入って$2ぐらいでお得でした。
パーティクルシステムも勉強しないと、ちょっといじりたいなと思ってもなかなかできないですね。
Vector3 pos = transform.position + Vector3.up*2.2f+transform.forward*1; GameObject obj; if (type == 3 ) // 魔法使い { obj = (GameObject)Instantiate(Resources.Load("Magic"), pos, transform.rotation); obj.GetComponent<Magic>().power = attackPower; obj.GetComponent<Magic>().enemy = enemy; obj.GetComponent<Magic>().target = targetcc.gameObject; Vector3 pos2 = transform.position + Vector3.up * 0f; GameObject obj2; obj2 = (GameObject)Instantiate(Resources.Load("VenomSpell"), pos2, transform.rotation); Destroy(obj2, 3f); }
Magicはトリガー付きの球です(MeshRenderが非表示)。攻撃力とターゲットを設定して生成。
緑色の魔法陣エフェクトを自分の足元で生成。Destroyは第二引数に時間を設定しておくと、指定時間後に自動削除されるので便利です。
親から、攻撃力と敵を与えられて生成される。Startで敵の方向ベクトルを作っておいて、後はひたすらその方向に移動していく。
球の大きなトリガーがついているので、触れた敵のGetDamage()を呼び出してダメージを与えます。
これが弓では何か敵に当たると、そこでデストロイしてますが、範囲攻撃の魔法はDestoryしないので、指定時間までは連続で殺傷できます。
ここでは寿命を3秒にしてますが、放っているキャラに応じて変えたい場合は、powerのように外部から値を渡せばいいです。
magic.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Magic : MonoBehaviour { public float power; public GameObject target; public int enemy; Character targetcc; Main main; float timer; Vector3 fw; void Start() { main = GameObject.Find("Main").GetComponent<Main>(); timer = 3f; targetcc = target.GetComponent<Character>(); fw = (target.transform.position + Vector3.up * 2.5f - transform.position).normalized; Vector3 pos2 = transform.position + Vector3.up * 0f; GameObject obj2; obj2 = (GameObject)Instantiate(Resources.Load("IceSpear2"), pos2, transform.rotation,this.transform); Destroy(obj2, 3f); } void Update() { if (timer > 0) timer -= Time.deltaTime; else { Destroy(this.gameObject); return; } transform.position += fw * Time.deltaTime * 7; } void OnTriggerEnter(Collider other) { Character cc = other.GetComponent<Character>(); //Debug.Log(other.name); if (cc != null && cc.enemy!=enemy ) cc.getDamage(power); } }
Start()で、Destroy(this.gameObject,3f)としておけばupdate()でtimer更新はいらないですね。