//tips
//photon仕様の見直し
以前参考にしていたPhotonの解説ページがunity connect終了に伴い消滅してしまっていた残念。自力で問題を解決していく。
※下記にPhoton解説ページが再構成されているよう
https://zenn.dev/o8que/books/bdcb9af27bdd7d/viewer/18e958#%E5%80%A4%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9
ダメージ処理が追加されているDeerAtackManagerスクリプトは本体の子要素のオブジェクトについており、photon viewコンポーネントはついていないため photonView.RPC(nameof(AttackDamage), RpcTarget.All);が実行されないのではないかと考える。
[PunRPC]が利用できるようにコライダーがついているオブジェクトにもphotonviewをアタッチしてみる。
プレイヤーシーンでは相手のオブジェクトにダメージを与えられるように戻ったが、他のシーンではまだダメージを与えられていない。考えてみるとbuild and runしたシーンにもUIが表示されていないのはおかしいのでdemoの画面のサイズ調整を行いボタンなどを表示させるようにした。
RPCで命令を飛ばした先で下記が実行されないのはhPScriptに対象物が入っていないからではないかと考え、hPScriptの取得の方も [PunRPC]で飛ばすようにする。
[PunRPC]
void AttackDamage()
{
hPScript.hp -= powerEnemy;
Debug.Log("AttackDamage");
}
下記を入れて見たが失敗。オブジェクトを取るにしろ同様の形になってしまう。
[PunRPC]
void GetTarget()
{
hPScript = hPScript;
}
Demoの方から攻撃させunityエディターのコンソールでエラー内容を取得したら、やはりhPScript.hp -= powerEnemy;の部分がネックになっている。
NullReferenceException: Object reference not set to an instance of an object
DeerAtackManager.AttackDamage () (at Assets/Charafunc/DeerAtackManager.cs:108)
他の類似スクリプトを参考に見ていたが、RPCを行う際にTriggerで取得したotherを利用して、他のオブジェクトにダメージを与えるものは見ない。
自分のスコアを上げるか、接触物にtagをつけて、接触対象が侵入した場合に自身でダメージ処理を行なっている。
今回の場合も接触対象が侵入した場合に自身でダメージを与える処理をRPCで異なるシーンの自身に命令した方がいいかもしれない。
コライダーがついているDeer R FootオブジェクトのtagにWeaponを設定。このweaponオブジェクトがDeer本体のコライダーに侵入した際にダメージ判定があこるようにスクリプトを変化させてみる。
この処理をHPScriptに担わせることができないか実装していく。
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Weapon")
{
Debug.Log("hit Player");
Debug.Log("hit Damage");
hp -= 1;
}
上記でダメージを与えることができることは確認できた。hp -= 1;部分に[RPC]を組み込みこんだ。
これで無事ダメージの同期ができるようになった。
あとはダメージ判定部分をhPScript内に入れ替えていけばよい。