【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番目に出てきましたので、インポートします〜
Max Adventure Modelをインポート
②Max(Asset)の設定
続いてMaxの設定をしていきます〜
Projectフォルダにmaxというフォルダがインポートされていますので、開いてプレハブをクリックします〜
InspectorビューにMaxの情報が出てくるので、Rigをクリックし、Animation Typeを「Humanoid」に変更します〜
Maxプレハブ > Rig > Animation Type: Humanoid
選択したら下のApplyボタンを押します〜
続いてInspectorビューからAnimationsを選択し、Loop TimeとLoop Poseにチェックを入れ、Bake Into Poseのチェックを外します〜
UNETを使うとAnimationのLoopが効かないため、こちらで設定しておく必要があるようです〜
このままだとidleアニメーションに設定しただけなので、walkアニメーションにも設定をしていきます〜
walkをクリックし、Loop Time、Loop Pose、Bake Into Poseにチェックを入れます〜
runアニメーションにも設定していきます〜
Loop Time、Loop Pose、Bake Into Poseにチェックを入れます〜
③Animator Controllerの設定
続いてAnimatorを作っていきます〜ProjectビューにてCreate > Animator Controllerを選択し、名前をPlayerControllerとします〜
Animator画面を開き、右クリック→Create State > From New Blend Treeを選択します〜
続いて作成したBlend Tree Stateをダブルクリックします〜するとBlend Treeの設定に入るので、InspectorビューにてBlend Treeの名前を「Motion」に変更します〜
名前の変更
続いてMotion Fieldを3つ追加します〜Inspectorビューのプラスボタンを押し、Add Motion Fieldをクリックします〜
Motion Fieldを3つ作成
続いてSpeedという名前のパラメーターをAnimator Controllerに作成します〜画面左にあるプラスボタンを押し、Floatを選択します〜
最後に作成したSpeed変数を、Blend TreeのParameterに設定し、各AnimationをBlend Treeに設定していきます〜
④PlayerプレハブをMax(Asset)にする
Maxが完成したので、今まではCapsule型だったPlayerプレハブの形をMaxに変えていきます〜
まずはPlayerとMaxをHierarchy上に戻し、MaxをPlayerプレハブの子オブジェクトにします〜
ドラッグ&ドロップ!
MaxについているAnimatorコンポーネントは削除します〜
また、FirstPersonCharacterの子オブジェクトであるCubeと、Capsuleを非アクティブ化します〜
次にPlayerにNetwork Animatorコンポーネントを取り付けます〜
Network Animatorコンポーネントを取り付けると、自動的にAnimatorコンポーネントも付きます〜
Animatorコンポーネントには先ほど作成したPlayerAnimatorと、MaxのAvatarを設定します〜
次にAnimatorコンポーネントをNetwork AnimatorのAnimatorに設定します〜
⑤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をアニメーションさせられるようになりました〜
⑥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)に変更して下さい〜
【結果】
ちょっと走っているところのキャプチャをとるのが難しかったので待機状態ですが、無事アニメーションを同期させることができました〜
今回はここまでです〜
ありがとうございました〜
【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】