前提・実現したいこと
UnityのMirrorというアセットを使ってオンラインゲームでのHPの個別管理をしたいと思っています。
私の理解が浅く、使い方そのものが間違っている可能性もございます。
発生している問題・エラーメッセージ
弾が衝突した段階で弾を消滅&ダメージ判定+ダメージテキストの更新を行っているが、
弾を消滅させる処理をさせるとホスト側で「のみ」ダメージ判定+ダメージテキストの更新の処理が実行されない
出ません。
C#
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using Mirror; public class PlayerHP : NetworkBehaviour { [SyncVar(hook = nameof(HookHP))] public int HP = 100; void Start() { GetComponentInChildren<Text>().text = HP.ToString(); } void OnCollisionEnter(Collision other) { Damage(); //この関数がある場合、ホストの場合HookHPが呼び出されない、 //(クライアント側からは呼び出されている、またこの処理を消すとホスト側も正常に動作 ※NetworkServer.Destroy(other.gameObject); } [Command] void Damage() { HP -= 10; } //これがホスト側のみ呼び出されなくなる void HookHP(int oldValue,int newValue) { HP = newValue; GetComponentInChildren<Text>().text = HP.ToString(); Debug.Log("書き換えました"); } }
試したこと
エラーが出ないので、皆目検討がつかず...
補足情報(FW/ツールのバージョンなど)
Unity:2020.3.16f1
Mirror:46.0.4
主に下記記事を仕組みを知るために参考にしています。
(UNETとMirrorは厳密にいうと別物ですが、UNetを個人が回収したバージョンがMirrorになります
https://motoyama.hateblo.jp/entry/unet-09
https://motoyama.hateblo.jp/entry/unet-fps
###追記
※NetworkServer.Destroy(other.gameObject);をDestroy(other.gameObject,0.05f);に変更した所望む動作になりました。
ということは恐らく処理順の問題で、hookHPが呼び出される前にDestroyされた可能性があります。
こういう場合処理順序の問題になるのでしょうか?引き続き解決方法を模索します。
知見の深い方でスムーズなやりかたを知っている場合ご回答お願い致します
あなたの回答
tips
プレビュー