MawaLog

一日一日、楽しく生きる。技術と音楽が好き。

開発日誌: Unity::アドベンチャー3Dゲーム開発vol.7::敵キャラ実装

f:id:k_mawa:20180201114227j:plain

コメント

敵キャラ回復アイテムの逆の効果を作るだけなので回復アイテムの実装が終わっていれば、もうひと頑張り(動きの設定の追加)でできます。

手順1:キャラ設定と素材入手

f:id:k_mawa:20180201232918j:plain

フリーで敵キャラっぽいものがAssetStoreで見つかりました。いい感じです。

Cartoon Zombie Fred (Free) - Asset Store

手順2:ゾンビプレファブを設置

ドラッグアンドドロップでいつものように追加しましょう。スクリプト追加するので1体だけにします。スクリプトつけた後にもう一度プレファブ化します。

  • ここで衝突判定用に"enemy"とタグ付けします。

手順3:ゾンビの動きスクリプトを追加

ゾンビプレファブに追加します。

    public GameObject hero; //主人公宣言(キャラをコンソールであとでドラッグアンドドロップします)
    public Transform hero_transform; //主人公の座標宣言
    public float rotMaximum = 1.0f; //回転係数
    public float speedMove = 0.1f; //移動係数
    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        hero = GameObject.Find("ThirdPersonController"); 
        //"ThirdPersonController"というゲームオブジェクトを見つけて、hero変数に格納
        hero_transform = hero.transform; 
        //heroの座標を取得
        Vector3 vector = hero_transform.position - transform.position; 
        //heroの座標 - 敵キャラの座標で差分の座標を計算(3次元ベクトル)
        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(new Vector3(vector.x, 0, vector.z)), rotMaximum); 
        //敵キャラの初期状態(回転の)から、Y軸を固定して主人公の向きへ回転する、回転状態の変化は回転係数(0~1)に従う。今回は1だから早く振り向く感じかな。
        transform.Translate(Vector3.forward * speedMove); 
        //Vector3.forwardはvector(0, 0, 1)と同じ意味です。この文脈だと前に進みます。

    }

回転はクォータニオンというUnityにおいて回転でつかえる四元数という数学概念を使います。中身はとりあえず置いておいて、同じ回転に関する情報をクォータニオン形式←→オイラー角形式で変換しながら2形式(wordとexcelみたいな)で使い分けられるくらい認識でとりあえずゲーム開発は進めることが可能です。オイラー角形式はベクトルのように使いやすいのですが、回転速度に変化がでたときに不都合らしい

Quaternion.Slerp(<1初期状態の回転状態のクォータニオン>,<2終了時の回転状態のクォータニオン>,<3:0~1の定数>) : <1>から<2>の状態へ変化(回転)させる。<3>の配分で状態変化を規定する。例0.5なら<1><2>の状態は状態変化中の50%、50%で取り扱う感じ。
transform.rotation :指定方向に回転します
Quaternion.LookRotation(<3次元ベクトル>) :<3次元ベクトル>の向きを向く。y座標(Unityだと高さ)を0にすると、「縦方向は動かさずに」 という意味になるので、転がりにくくなります。(自分はさらにmass(質量)を高めにするなどで対処しました)
transform.Translate:指定方向に動きます

手順4:衝突判定スクリプトにも追記

回復アイテムやオーブの衝突判定と同じです。

if (other.gameObject.tag == "enemy") //衝突したのがタグ=enemyだったら
                {
                    scorecontroll.Timer_sec -=60; //1分間時間を奪う
                    Destroy(other.gameObject); //敵キャラ消滅
                }

手順5:完成

こんな感じです。とりあえず基礎工事は終わったかなという感じですね^^

参考文献

わかりやすかったです gamesonytablet.blogspot.jp

transform.Translateリファレンス
docs.unity3d.com (↑英語で読みたくない場合、google翻訳を使うといいかもです)

↓Quaternionは公式チュートリアルが分かりやすい!日本語字幕もあるのでありがたいですね^^

オイラー角の内容で参考になる解説です http://irobutsu.a.la9.jp/mybook/ykwkrAM/sim/EulerAngle.html