Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity9】UNETでAnimationを同期させる!【UNET21】

Unity5.1.1p3 Personal(2015年7月)

前回の続きです〜

今回はAnimationを同期していきます〜



UNET Part 21 - Network Animator - YouTube

【目標】Animationを同期させる!

①Assetのダウンロード

まずはAssetをダウンロードします〜今回は「Max Adventure Model」というAssetです〜

「max」で検索すると2番目に出てきましたので、インポートします〜

f:id:hiyotama:20150724175339p:plain
Max Adventure Modelをインポート

②Max(Asset)の設定

続いてMaxの設定をしていきます〜

Projectフォルダにmaxというフォルダがインポートされていますので、開いてプレハブをクリックします〜



InspectorビューにMaxの情報が出てくるので、Rigをクリックし、Animation Typeを「Humanoid」に変更します〜

f:id:hiyotama:20150724175849p:plain
Maxプレハブ > Rig > Animation Type: Humanoid

選択したら下のApplyボタンを押します〜


続いてInspectorビューからAnimationsを選択し、Loop TimeとLoop Poseにチェックを入れ、Bake Into Poseのチェックを外します〜

f:id:hiyotama:20150727091946p:plain

UNETを使うとAnimationのLoopが効かないため、こちらで設定しておく必要があるようです〜


このままだとidleアニメーションに設定しただけなので、walkアニメーションにも設定をしていきます〜
walkをクリックし、Loop Time、Loop Pose、Bake Into Poseにチェックを入れます〜

f:id:hiyotama:20150727093214p:plain

runアニメーションにも設定していきます〜
Loop Time、Loop Pose、Bake Into Poseにチェックを入れます〜

f:id:hiyotama:20150727093646p:plain

③Animator Controllerの設定

続いてAnimatorを作っていきます〜ProjectビューにてCreate > Animator Controllerを選択し、名前をPlayerControllerとします〜

f:id:hiyotama:20150727101804p:plain

Animator画面を開き、右クリック→Create State > From New Blend Treeを選択します〜

f:id:hiyotama:20150727102138p:plain

続いて作成したBlend Tree Stateをダブルクリックします〜するとBlend Treeの設定に入るので、InspectorビューにてBlend Treeの名前を「Motion」に変更します〜

f:id:hiyotama:20150727102409p:plain
名前の変更

続いてMotion Fieldを3つ追加します〜Inspectorビューのプラスボタンを押し、Add Motion Fieldをクリックします〜

f:id:hiyotama:20150727102651p:plain
Motion Fieldを3つ作成

続いてSpeedという名前のパラメーターをAnimator Controllerに作成します〜画面左にあるプラスボタンを押し、Floatを選択します〜

f:id:hiyotama:20150727102925p:plain

最後に作成したSpeed変数を、Blend TreeのParameterに設定し、各AnimationをBlend Treeに設定していきます〜

f:id:hiyotama:20150727105747p:plain

④PlayerプレハブをMax(Asset)にする

Maxが完成したので、今まではCapsule型だったPlayerプレハブの形をMaxに変えていきます〜

まずはPlayerとMaxをHierarchy上に戻し、MaxをPlayerプレハブの子オブジェクトにします〜

f:id:hiyotama:20150727110311p:plain
ドラッグ&ドロップ!

MaxについているAnimatorコンポーネントは削除します〜
また、FirstPersonCharacterの子オブジェクトであるCubeと、Capsuleを非アクティブ化します〜

次にPlayerにNetwork Animatorコンポーネントを取り付けます〜
Network Animatorコンポーネントを取り付けると、自動的にAnimatorコンポーネントも付きます〜

Animatorコンポーネントには先ほど作成したPlayerAnimatorと、MaxのAvatarを設定します〜
次にAnimatorコンポーネントをNetwork AnimatorのAnimatorに設定します〜

f:id:hiyotama:20150727111237p:plain

⑤FirstPersonControllerスクリプトの修正

続いてFirstPersonControllerスクリプトを修正し、移動することでBlend Treeの状態が変わるようにしていきます〜

FIrstPersonControllerスクリプトを開いたら、command + fにて検索ウィンドウを開き、「getaxis」と入力します〜すると、キーボード入力をしている箇所へ飛ぶので、以下のように修正します〜

        private void GetInput(out float speed)
        {
            // Read input
            float horizontal = CrossPlatformInputManager.GetAxis("Horizontal");
            float vertical = CrossPlatformInputManager.GetAxis("Vertical");

//********** 開始 **********//
			//Added UNET tutorial
			
			//上下入力の絶対値を取得
			float animSpeed = Mathf.Abs(vertical);
			//取得した絶対値をAnimatorControllerのSpeed変数にセット
			GetComponent<Animator>().SetFloat("Speed", animSpeed);
//********** 終了 **********//
			
            bool waswalking = m_IsWalking;
			
#if !MOBILE_INPUT
            // On standalone builds, walk/run speed is modified by a key press.
            // keep track of whether or not the character is walking or running
            m_IsWalking = !Input.GetKey(KeyCode.LeftShift);
#endif
            // set the desired speed to be walking or running
            speed = m_IsWalking ? m_WalkSpeed : m_RunSpeed;
            m_Input = new Vector2(horizontal, vertical);

            // normalize input if it exceeds 1 in combined length:
            if (m_Input.sqrMagnitude > 1)
            {
                m_Input.Normalize();
            }

            // handle speed change to give an fov kick
            // only if the player is going to a run, is running and the fovkick is to be used
            if (m_IsWalking != waswalking && m_UseFovKick && m_CharacterController.velocity.sqrMagnitude > 0)
            {
                StopAllCoroutines();
                StartCoroutine(!m_IsWalking ? m_FovKick.FOVKickUp() : m_FovKick.FOVKickDown());
            }
        }

FirstPersonController.cs

AnimatorControllerへ変数をセットする処理を追加しました〜

これでとりあえずPlayerをアニメーションさせられるようになりました〜


f:id:hiyotama:20150727113125p:plain

⑥Player_NetworkSetupの修正

最後にPlayerアニメーションを同期させる記述を、Player_NetworkSetupスクリプトに追加していきます〜

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class Player_NetworkSetup : NetworkBehaviour {
	[SerializeField]Camera FPSCharacterCam;
	[SerializeField]AudioListener audioListener;

	public override void OnStartLocalPlayer ()
	{
		GameObject.Find ("Scene Camera").SetActive (false);
		GetComponent<UnityStandardAssets.Characters.FirstPerson.FirstPersonController> ().enabled = true;
		FPSCharacterCam.enabled = true;
		audioListener.enabled = true;
		
//********** 開始 **********//
		//LocalPlayerのRendererを非表示にする
		Renderer[] rens = GetComponentsInChildren<Renderer> ();
		foreach (Renderer ren in rens) {
			ren.enabled = false;
		}
		//LocalPlayerのAnimatorパラメータを自動的に送る
		GetComponent<NetworkAnimator>().SetParameterAutoSend(0, true);
	}
	
	public override void PreStartClient ()
	{
		//ClientのAnimatorパラメータを自動的に送る
		GetComponent<NetworkAnimator>().SetParameterAutoSend(0, true);
	}
//********** 終了 **********//
}

Player_NetworkSetup.cs

まずはLocalPlayerの子オブジェクトについているRendererを配列に入れて、全て非表示にしています〜
これでゲーム画面に自分が映らないので、画面がスッキリします〜

次にSetParameterAutSendを実行しています〜これにより、NetworkAnimatorに設定されているAnimatorのパラメータが変更された時、自動的に同期をとるようになります〜

同様の処理をPreStartClientメソッドにも記述することで、Clientのパラメータも同期されるようになります〜


最後に向きを変える動きを同期させるため、Network TransformコンポーネントのRotation AxisをY (Top-Down 2D)に変更して下さい〜

f:id:hiyotama:20150727123656p:plain

【結果】

f:id:hiyotama:20150727123912p:plain

ちょっと走っているところのキャプチャをとるのが難しかったので待機状態ですが、無事アニメーションを同期させることができました〜


今回はここまでです〜

ありがとうございました〜


【Unity9】UNETでマルチプレイヤーなオンラインゲーム開発【UNET1】
【Unity9】UNETでプレイヤーの動きを補間し、なめらかな動きを実現する【UNET1-2】
【Unity9】UNETでネットワーク越しに傾き(Rotation)を同期させる【UNET2】
【Unity9】UNETでオンライン開始時のプレイヤー生成位置を変更する【UNET2-2】
【Unity9】UNETのネットワークトラフィックを軽減し、効率化する【UNET3】
【Unity9】UNETのlatency(遅延時間)を改善する【UNET4】
【Unity9】UNETのlatency(遅延時間)を表示して、ちょっとだけ改善する【UNET4-2】
【Unity9】UNETのSyncVarのhookの使用例と、前時代の同期方法【UNET5】
【Unity9】UNETを使ってRotationを同期させる【UNET6】
【Unity9】UNETで各プレイヤーにPlayerIDを設定する【UNET7】
【Unity9】UNETで敵プレイヤーにダメージを与える!【UNET8】
【Unity9】UNETでHPを画面に表示し、Playerへダメージを与える【UNET9】
【Unity9】UNETでHPが0以下になった時、Playerを破壊する!【UNET10】
【Unity9】UNETで死んだPlayerを生き返らせる!【UNET11】
【Unity9】UNETでゾンビAIを出現させる!【UNET12】
【Unity9】UNETでゾンビ生成時にユニークなIDを付ける!【UNET13】
【Unity9】UNETでゾンビを撃つ!【UNET14】
【Unity9】UNETでゾンビに攻撃させる!【UNET15】
【Unity9】UNETでゾンビの動きをスムーズにシンクロさせる!【UNET16】
【Unity9】UNETでゾンビ発生地点を増やす【UNET17】
【Unity9】UNETで発生したバグを取り除く【UNET18】
【Unity9】Unity MultiPlayerを使ってネットワーク越しにマッチメイキング!【UNET19】
【Unity9】GUIを改善して、Network Managerを見やすくする!【UNET20】
【Unity9】表示したGUI(Network Manager)を機能させる!【UNET20-2】
【Unity9】UNETでAnimationを同期させる!【UNET21】