落書きノート

ふと自分が気になった事を書いてます

Unity ナビメッシュエージェント 敵モデルの設定 攻撃判定 スクリプト間の参照等々

一応のゲームの形まで持っていってるが、アセットに恵まれないせいか、苦戦中。ファイティングユニティちゃんのお試し版を使っているが、これを剣みたいな武器に変えようかなと思案中…。

using UnityEngine;
using System.Collections;

public class spider : MonoBehaviour
{ 
    public GameObject player;
    private NavMeshAgent agent;
    private Animator anim;
    private Animator animP;
    private AnimatorStateInfo currentBaseState;
    private AnimatorStateInfo currentBaseStateP;
    private static int damageState = Animator.StringToHash ("Base Layer.Damage");
    private static int attackState = Animator.StringToHash ("Base Layer.HiKick");

    // Use this for initialization
    void Start ()
    {
        anim = GetComponent<Animator> ();
        animP = player.GetComponent<Animator> ();
        agent = GetComponent<NavMeshAgent> ();
    }
    
    // Update is called once per frame
    void Update ()
    {
        currentBaseState = anim.GetCurrentAnimatorStateInfo (0);
        currentBaseStateP = animP.GetCurrentAnimatorStateInfo (0);

        if (currentBaseState.fullPathHash == damageState) {
            if (!anim.IsInTransition (0)) {
                anim.SetBool ("damage", false);
            }
        }

        if (!anim.IsInTransition (0)) {
            agent.SetDestination (new Vector3 (400.0f, 0.0f, 320.0f));
            anim.SetFloat ("speed", agent.velocity.sqrMagnitude);
        }
    }

    void OnCollisionEnter (Collision other)
    {
        if (other.gameObject.tag == "Player") {
            if(currentBaseStateP.fullPathHash == attackState){
                if (!anim.IsInTransition (0)) {
                    anim.SetBool ("damage", true);
                }
            }
        }
    }
}

ナビメッシュエージェントを使うようになってから、敵モデルを動かすのが楽になった。TerrainでNavMeshウィンドウを開いて、Bakeするとナビメッシュエージェントを使う準備が整う。詳細は検索エンジンで調べてもらえればわかると思う。

これをすることによって障害物を避けて歩いたり、指定した座標までモデルを動かすことが出来る。行動パターンもアルゴリズムを適用すれば出来る様になるだろう。例えば、メタルギアソリッドのような敵兵士の行動パターン…といえば分かりやすいか?

後はアニメーションをつけないと歩いているように見えないので、アニメーターウィンドウでステート遷移図を作り、パラメーターをfloatで作成。そしてSetFloatメソッドで数値をセットする。このソースコードの場合だと、加速度を設定している。

攻撃判定は色々試してみたが、まだできていない。ファイティングユニティちゃんにこだわるのはやめにして、後日、アセットストアで適当なアセットをダウンロードして試してみることにする。

スクリプト間で、違うオブジェクトの情報を参照したい場合、GameObjectの変数をpublic宣言しておけばいい。これにシーンで配置しているオブジェクトを設定すれば、参照出来る様になる。

まだ課題が残っているが、後日また暇な時にやるとしよう。

e091ac7b-949b-34ed-81fa-2f795f698308