UnityNetworkを使ったマルチプレイの対応をやっていきたいと思います。
Unityでの簡単なキャラクターの移動スクリプト、AnimatorControllerの使い方を習得している方が対象になります。
Photonを使ったオンライン対応については
↑の記事から順番に作って頂くとPhotonでの基本的なオンライン対応が出来ます。
UnityNetworkとPhotonは何が違うかと言うと、UnityNetworkはUnity標準搭載のオンライン対応機能で、Photonは外部サービスなので別途PUN(PhotonUnityNetwork)をインポートする必要があると言う事でしょうか。
後はオンライン対応する為のスクリプトの処理が少し変わってきます。
Photonのオンライン対応をやったので、UnityNetworkの対応も、という事でこのカテゴリが出来ました。(^_^;)
UnityNetworkの対応はUnityのチュートリアルやマニュアルを見た方がわかりやすいかもしれません。
わたくしの記事の方がわかりやすいという方(いるかわかりませんが)、自分の理解を深める為、チュートリアル等を参考にUnityNetworkでのオンライン対応の記事を書いていきます。
実はだいぶ前に対応した事があったんですが、放置してたら完全に中身を忘れてしまったので最初からやる事になりました・・・。(-_-)
PhotonではPhotonサーバーにログインする状態から作成していきましたが、UnityNetworkではそこら辺の処理はNetworkManagerHUDで確認する事にして、中身のオンライン対応についてやってきたいと思います。
UnityNetworkのログイン処理辺りは、わたくしに出来るようになればやってみたいですが、いかんせん能力が足りないのでどうなるか(;一_一)
オフラインで動くキャラクターの作成
オンライン対応する前にオフラインで動かすキャラクターを作成します。
ほぼPhotonのオンライン対応キャラクターと同じなので、やらなくてもいいんですが・・・、別カテゴリなのでやっておきます(謎)。
キャラクターの作成
StandardAssets/Characters/ThirdPersonCharacter/ModelsにあるEthanをヒエラルキーに設置しCharacterControllerの取り付けコライダのサイズを調整します。
↑のようにCharacterControllerのサイズを変更しました。
Ethanの名前をUnityNetworkPlayerという名前に変更しました。
移動と攻撃スクリプトの作成
移動と攻撃をするUCharaスクリプトを作成し取りつけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | using UnityEngine; using System.Collections; public class UChara : MonoBehaviour { private Animator animator; private CharacterController characterController; private float x; private float y; private Vector3 velocity; // Use this for initialization void Start () { animator = GetComponent<Animator>(); characterController = GetComponent<CharacterController>(); velocity = Vector3.zero; } // Update is called once per frame void Update () { // 地面に接地してる時は初期化 if(characterController.isGrounded) { velocity = Vector3.zero; x = Input.GetAxis("Horizontal"); y = Input.GetAxis("Vertical"); Vector3 input = new Vector3(x, 0, y); // 方向キーが多少押されている if(input.magnitude > 0.1f && !animator.GetCurrentAnimatorStateInfo(0).IsName("Attack")) { animator.SetFloat("Speed", input.magnitude); transform.LookAt(transform.position + input); velocity += transform.forward * 2; // キーの押しが小さすぎる場合は移動しない } else { animator.SetFloat("Speed", 0); } if(Input.GetButtonDown("Fire1") && !animator.GetCurrentAnimatorStateInfo(0).IsName("Attack") && !animator.IsInTransition(0) ) { animator.SetTrigger ("Attack"); } } velocity.y += Physics.gravity.y * Time.deltaTime; characterController.Move(velocity * Time.deltaTime); } } |
動かすスクリプトもPhoton版とまったく同じですね。
AnimatorControllerの取り付け
AnimatorControllerを作成し取り付けます。
状態と遷移は↑のように作成しSpeedが0.1より上の時Walk、0.1より下の時Idle、AttackがトリガーされたらAttack状態へと遷移するように設定します。
Attack→Idleへの遷移条件はなしでHas Exit Timeにチェックを入れます。
Photonでの対応ではアニメーションパラメータにbool型のAttackを使用していましたが、UnityNetworkではTrigger型のAttackを使用してみます。
アニメーションイベントの作成
AnimatorControllerのAttack状態に設定したアニメーションにアニメーションイベントを取り付けます。
攻撃の開始時にAttackStart、攻撃終了時にAttackEndを作成します。
使用するアニメーションに応じてイベントを作成する位置を変更してください。
↑がAttackStartの位置、
↑がAttackEndの位置になります。
キャラクターに剣を持たせる
キャラクターに剣を持たせます。
右手のボーンの子要素に剣を配置します。
↑のような感じに武器の位置と角度を調整します。
武器にはCapsuleColliderを取り付け剣のサイズに合わせたコライダのサイズに調整します。
また、Rigidbodyの取り付けを行いIs Kinematicにチェックを入れます。
このCapsuleColliderのオン・オフをアニメーションイベントAttackStart、AttackEndを受け取り、武器の当たり判定の切り替えを行います。
キャラクターにUProcessAttackスクリプトを作成し、取り付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | using UnityEngine; public class UProcessAttack : MonoBehaviour { public Collider col; void AttackStart() { col.enabled = true; } void AttackEnd() { col.enabled = false; } } |
UProcessAttackのインスペクタでColに剣のコライダをドラッグ&ドロップします。
UnityNetworkPlayerのインスペクタは
↑のようになりました。
終わりに
今回はとりあえず動いて攻撃アニメーションをする操作キャラクターの作成を行いました。
ほぼPhotonでのオンライン対応の最初の記事と同じですが、敵の作成や攻撃スクリプト等は排除しました。
もし必要になったらその時に作成したいと思います。