AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

魔法のエフェクト追加

http://27.120.88.154/rts7.gif
範囲攻撃は突き抜けるので、縦に並んでいる敵には有利ですね。
最後は、ダブルノックアウト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更新はいらないですね。