UnityNetworkでオンライン対応4-HPの表示と攻撃機能-

今回はUnityNetworkでオンライン対応の第4回で、キャラクターのHPの表示と他のキャラクターへの攻撃の機能を作成していきたいと思います。

前回は、キャラクターの同期とカメラの設定を行いました。

UnityNetworkで自身のプレイヤーキャラクターだけ動かす処理と、位置やアニメーションの同期、カメラが自身のキャラクターを追いかける機能の作成を行ってみたいと思います。

キャラクターへの攻撃機能を作成すると、オンラインに接続した他のキャラクターと対戦をするようなゲームを作る事が出来ます。

スポンサーリンク

キャラクターのステータス

キャラクターのステータススクリプトとHP表示用UIを作成していきます。

Hp表示用UIの作成

まずはUnityNetworkPlayerの子要素に右クリック→UI→Textを作成し、名前をHpと変更します。

UnityNetworkPlayerの子要素にHP表示用UIを作成

↑のような感じになります。

Hpを選択し、インスペクタでCanvasのRender ModeをWorld Spaceにし、ワールド空間のUIにします。

RectTransformのWidthやHeightのサイズ変更、子要素のTextをAnchorをstretch、stretchにしてCanvasサイズにテキストのサイズを合わせます。

ネットワークキャラクターのHPの設定

↑のような設定値を入れました。

実際のHp用のUIは

キャラクターHPの表示位置と大きさ

↑のような感じの位置と大きさにしました。

またHpゲームオブジェクトは常にカメラの方向を向かせたいのでRotateHpTextスクリプトを作成しHpゲームオブジェクトに設定します。

これでキャラクターの移動と共にHpを表示したUIも移動することになります。

キャラクターステータス処理スクリプトの作成

キャラクターのステータス関連の処理を行うUStatusスクリプトを作成しUnityNetworkPlayerゲームオブジェクトに取り付けます。

UStatusスクリプトではキャラクターのHPと攻撃力を保持し、キャラクターがダメージを受けた時の処理も担当する事にします。

hpフィールドは[SyncVar]アトリビュートを取り付け同期するようにします。

フックでOnChangeHPメソッドを指定しているので、サーバーでhpの値が書き変わった時にクライアントでOnChangeHPメソッドが実行されます。

StartメソッドでHPを初期設定したくなりますが、ここで初期設定をしてしまうと自身のアプリケーション上のキャラクター全部のHPを設定してしまうので、HP表示用テキストの値にhpを設定するだけにします。

こうすることで他のキャラクターはSyncVarで同期されているのでその値が表示され、自身はインスペクタで設定した値になります。

自身のアプリケーション上のキャラクターには固有のIDを設定するようにします。

クライアント上で二人プレイをしてオンラインに繋ぐ場合はクライアント上でもユニークなIDを取り付ける必要があるかもしれません。

そこら辺は必要になったら対応していくという事で、今のところは無視していきます・・・・。

TakeDamageメソッドは攻撃を受けた時に呼び出されます。

[SyncVar]を付けたhpは同期されます。

クライアントではフックを使ってOnChangeHPメソッドが呼び出されるので、キャラクターのHPをHP表示用UIに再設定しています。

ここら辺の処理は混乱しますねぇ・・・・(^_^;)

とりあえずこれでキャラクターのHP表示用UI、ステータス関連の処理スクリプトの作成が完了しました。

UnityNetworkPlayerゲームオブジェクトにUStatusスクリプトを取り付けます。

UStatusの設定

UStatusのHpTextにはUnityNetworkPlayerの子要素のHP表示用UIをドラッグ&ドロップし、AttackPowerには10、Hpには100を設定しておきます。

攻撃機能の作成

次にキャラクターが剣を振って他のキャラクターに当たった時の処理を作成していきます。

まずはUnityNetworkPlayerのタグにPlayerタグを設定しておきます。

これは剣が当たったコライダがキャラクターである事を判別する為です。

次に剣にUAttackスクリプトを作成し取り付けます。

フィールドにUStatus型のuStatusを宣言し、Startメソッドで自身の親に設定しているUStatusスクリプトを取得します。

OnTriggerEnterメソッドは剣のコライダが他のコライダと接触した時に呼ばれるので、ここで他のキャラクターと接触したかを判定します。

まずはタグにPlayerが設定されていなければいけません(キャラクターとの当たり判定をする為)、

そして、Playerタグとの接触だけだと自分で振った剣が自分のコライダと接触した時も条件が成立してしまいます。

つまり剣を振るだけで自分の体力が減るわけですね・・・・(^_^;)

というわけで、接触したコライダが自身のキャラなのか他のキャラなのかの条件も加えます。

そこでキャラクターに設定したUStatusのGetIdでネットワークIDを調べて判定する事にします。

条件が成立した場合は接触した相手が持っているUStatusスクリプトのTakeDamageメソッドを呼び出しています。

これで攻撃処理も完成しました。

HP表示と攻撃機能の確認

機能が出来たので、ビルドした後複数アプリケーションを起動し確認してみましょう。

↑のようになりました。

攻撃を受けると自身のアプリケーションの他のキャラクターのHPが減り、他のアプリケーションのキャラクターのHPも変わっていますね。

後からログインしたプレイヤーにはすでにダメージを受けたキャラクターのHPは減った状態で表示されているのがわかります。

攻撃が当たっているように見えてHPが減っていないのはオンラインとは関係ない部分が大きく、単純に当たり判定のすり抜けが起きているからです。

そちらは

Unityで速い攻撃モーションの時に武器と敵との当たり判定がされない事があります。そこで自分でメッシュを生成しそれをコライダに設定する事で対処出来るようにします。

↑を参照してください。

終わりに

SyncVarアトリビュートを使ってHPを同期する事が出来ました。

サーバーのキャラクターのHPだけを減らし、それをクライアントの値と同期するという感じですね。

混乱しますが・・・・(^_^;)

今回はHPを減らす事が出来るようになりましたが、HPが0以下になっても何も処理をしてません。

そこで、次回はキャラクターの登場位置の設定と、HPが0になった時に再度登場させる機能を作成していきます。

参考サイト

Unityチュートリアループレイヤーの体力をネットワーク化するー

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます