落書きノート

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

Unity 敵モデル配置 諸々の設定

アニメーションがうまく行っていないが、とりあえず衝突判定ぐらいは出来た。

まず、敵モデルを適当にアセットストアからダウンロードし、インポートする。そして敵モデルに最適だと思われるコライダを追加する。そして、リッジドボディも追加する。この際、モデルが動かないように設定する。Freezeと書かれている項目に全部チェックを入れる。後は、Use Gravityにチェックが入ってなかったら入れる。

以下は、スクリプト

using UnityEngine;
using System.Collections;

[RequireComponent(typeof (Animator))]

public class spider : MonoBehaviour {
    private Animator anim;
    private AnimatorStateInfo currentBaseState;

    static int damageState = Animator.StringToHash("Base Layer.Damage");

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

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

    void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.tag == "Player") {
            anim.SetBool ("damage", true);
        }
    }
}

前回の投稿から反省して、今どきのコーディングに変えてみた。

このスクリプトを敵モデルに追加した。敵モデルはグラフィック以外、何も設定されていない状態なので、アニメーターから定義した。

とりあえずIdle状態を作り、そこからダメージを受けた時の状態を作成。上記のソースコードの通り、damageというブール変数を作成し、トランジションに作成したブール変数を設定する。

敵モデルに攻撃してダメージを食らわせた時に流れる音は、State Machine Behaviourを使っている。上記のソースコードの中で記述してもできることは出来る。その際、注意しないといけないのは、AudioSourceクラスのオブジェクトが作成出来ないということ。自分は最新バージョンを使っていて、仕様が変更されたのか、オブジェクトを作成すると例外処理が発生する。よって、AudioSource.PlayClipAtPointというふうに記述しないといけない。AudioClipはPublic宣言でもしておけば後が楽だろう。サンプルコードを提示する。

using UnityEngine;
using System.Collections;

public class damage_se : StateMachineBehaviour {

    public AudioClip Damage_SE;

     // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
        AudioSource.PlayClipAtPoint(Damage_SE, animator.gameObject.transform.position);
    }

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    //override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    //
    //}

    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
    //override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    //
    //}

    // OnStateMove is called right after Animator.OnAnimatorMove(). Code that processes and affects root motion should be implemented here
    //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    //
    //}

    // OnStateIK is called right after Animator.OnAnimatorIK(). Code that sets up animation IK (inverse kinematics) should be implemented here.
    //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    //
    //}
}

これをどうにかしてアニメーターウィンドウでビヘイビアを追加する。もちろんダメージを食らった時の状態に設定する。

アニメーションも一応指定する。先ほど作成したアニメーターの状態遷移図を敵モデルのコントローラに指定。そしてダメージを食らった時の状態にもアニメーションを指定。このアニメーションはHumanoidにしてあるアニメーターを使っている。

これで動けば完成。自分の環境ではアニメーション以外はうまく行った。後は、要はアセット次第である。

b0acf7d1-1f15-0b2e-2927-7f506fae29c9