//tips
//AIEnemy攻撃判定の同期見直し
以前修正したAIEnemy攻撃判定の同期だが、2体目の生成キャラにダメージを与えられていない事象が起きていたのでこちらを見直す。
AIの攻撃判定は現在MoveEnemyスクリプトのIEnumerator WaitAnimationfin()メソッドの中でコライダーのオンオフの切り替えを行い、コライダーの接触を感知したキャラクター側でダメージ加算を行うようにしている。
if (photonView.IsMine)下でStartCoroutine("WaitAnimationfin”);を実行しているので基本的にはAiの生成シーンでのみコライダーのオンオフが行われ、コライダーを感知したキャラクターはHPScript2スクリプトのOnTriggerEnter(Collider other)でif (photonView.IsMine)の下、ダメージ計算を行うようにしている。
こうするとAIキャラクターの生成シーン以外で生成されたキャラクターには攻撃が与えられないことになってしまうので、コライダーのオンオフ部分は生成シーンから他の各シーンに同期させる必要がある。
他のシーンでもゴーレムのスクリプトは存在するのでStartCoroutine("WaitAnimationfin”);を他のシーンでも呼び出せるようにしてやれば良い。
photonView.RPC(nameof(Coroutinewaitanim), RpcTarget.All);を挿入し、下記のようにRPCでコルーチン内容が全シーンで実行されるように変更する。
[PunRPC]
void Coroutinewaitanim()
{
StartCoroutine("WaitAnimationfin");
}
これでゴーレムからどのキャラクターに対してもダメージを与えられるようになった。
この流れでキャラクターと同様に、ゴーレムのアニメーションもtriggerからboolに切り替え、networkcharacterスクリプトも追加する。
animator.SetTrigger("Punch Attack”);をanimator.SetBool("PunchAttackB", true);に変更。ここでどこにanimator.SetBool("PunchAttackB", false);を設置するかが問題になる。
if (punchflag == false && onchase == true)の状態でStartCoroutine("WaitAnimationfin”);のコライダーのオンオフ操作に移るので、WaitAnimationfin()メソッド内に集約してみた。
これでphotonView.RPC(nameof(Coroutinewaitanim), RpcTarget.All);に信号と同時に判定とアニメーションが行われるはず。photonanimatorのparametersも変更するのを忘れない。
IEnumerator WaitAnimationfin()
{
yield return new WaitForSeconds(0.5f);
animator.SetBool("PunchAttackB", true);
SphereCollider rightfootcollider = rightfoot.GetComponent<SphereCollider>();
//rightfoot.GetComponent<SphereCollider>().enabled = true;
Debug.Log(rightfootcollider + "rightfootcollider");
rightfootcollider.enabled = true;
//var state = animator.GetCurrentAnimatorStateInfo(0);
//yield return new WaitWhile(() => state.IsName("bk_rh_right_A"));
yield return new WaitForSeconds(1f);
animator.SetBool("PunchAttackB", false);
rightfootcollider.enabled = false;
//rightfoot.GetComponent<SphereCollider>().enabled = false;
yield return new WaitForSeconds(1f);
punchflag = false;
onchase = false;
}
モーションの同期はバッチリできているが、コライダーをオンにする時間が少しなが過ぎてモーション後の接触でもダメージを与えているように思われるのでオンの時間を短くした。animator.GetCurrentAnimatorStateInfo(0).IsName("RabbitWalk3”)などのようにanimatorのstateでオンオフを調整する方法もあるが、以前はstate時間が短すぎるように感じたのでコルーチンの時間を使用している。また、punchflag=falseを代入する箇所が複数存在したのでパンチアクションを実行させるコルーチン内でのみにpunchflag=falseの代入を統一した。
これにより、ゴーレムのモーションはかなり改善された。
キャラクターのスキル使用時、他のシーンではスキルの状態を同期できていないので、キャラクタースキル使用の同期を次に考えていく。