//tips
//各キャラクタースクリプトのphoton対応調整
デバフの組み込みをHPScript2スクリプトを通して行なっていく。攻撃時のデバフなので、攻撃を受けた際に、HPScript2スクリプトから相手側のCharaModeManagerスクリプトなどを参照し、trueであれば、自分のEnvPlaymove5photonの値を変更するなどで対応する。
まずrabbitの攻撃を受けると受けた相手が一定時間スロウになるスキルを考える。
DeerActionlistスクリプトでは下記のコードを追加し、ボタンクリック時に自分のslow付与をオンにする。
public void Rabbitskill4()
{
envPlaymove5photon = myPlayer.GetComponent<EnvPlaymove5photon>();
envPlaymove5photon.rabitslowflag = true;
}
次に、複数処理が入るためCharaModeManagerではなく、EnvPlaymove5photonスクリプトにスロウ処理の内容を記載。
public void Rabbitslow()
{
StartCoroutine("Rabbitslowfunc");
//rabitslowflag = true;
}
IEnumerator Rabbitslowfunc()
{
rabbitspeedup = 0.8f;
yield return new WaitForSeconds(2);
rabbitspeedup = 1;
rabitslowflag = false;
Debug.Log("rabitslowflagfalse");
}
この内容をダメージの受け手が行う必要があるので、下記に追加した Debuffcheckメソッドで相手側のEnvPlaymove5photonスクリプトのboolを確認しつつ、自分のEnvPlaymove5photonスクリプトで処理内容を実行する。もし紛らわしかったらcharaModeManagerに確認は分けても良い。
private void OnTriggerEnter(Collider other)
{
if (photonView.IsMine)
{
charaModeManager = other.GetComponent<CharaModeManager>();
envPlaymove5photon= other.GetComponent<EnvPlaymove5photon>();
Debuffcheck();
void Debuffcheck()
{
if (envPlaymove5photon.rabitslowflag)
{
EnvPlaymove5photon myenvPlaymove5photon = GetComponent<EnvPlaymove5photon>();
myenvPlaymove5photon.Rabbitslow();
}
}
ゴーレムが先にキャラクターを殴ってしまい確認が難しいので、一旦photonCountのゴーレム生成箇所を隠して同期確認。
ダメージ判定がうまくいっていないようなので、prefabの設定確認。攻撃判定を出す右足のWeaponタグおよびistriggerのチェックが外れていたので設定。攻撃はできるようになったが、Debuffcheck()内部のデバッグ表示ができていない。
下記のようにDebuffcheck()メソッドの中にデバッグを入れて動作確認をしたところ、デバッグ1、2で表示されてしまい相手側のEnvPlaymove5photonを参照できていないことがわかった。
void Debuffcheck()
{
Debug.Log("Debuffcheck1");
if (envPlaymove5photon == null)
{
Debug.Log("Debuffcheck2");
return;
}
Debug.Log("Debuffcheck3");
if (envPlaymove5photon.rabitslowflag)
{
Debug.Log("Debuffcheck4");
EnvPlaymove5photon myenvPlaymove5photon = GetComponent<EnvPlaymove5photon>();
myenvPlaymove5photon.Rabbitslow();
envPlaymove5photon.rabitslowflag = false;
}
}
まずDeerActionlistのRabbitskill4()でenvPlaymove5photon.rabitslowflag = true;となっているかをまずは確認。画面でボタンクリック時にenvPlaymove5photon.rabitslowflag = true;となることは確認できた。
なので、Debuffcheck()メソッドで接触対象の参照を行わず、OntriggerEnterメソッド内で参照を完結する方法に変更した。
private void OnTriggerEnter(Collider other)
{
if (photonView.IsMine)
{
charaModeManager = other.GetComponent<CharaModeManager>();
envPlaymove5photon= other.GetComponent<EnvPlaymove5photon>();
if (envPlaymove5photon.rabitslowflag)
{
Debuffcheck();
}
これでも処理できない。その後、やっと、ここでのotherは足の部分のみのオブジェクトであり、envPlaymove5photon= other.GetComponent<EnvPlaymove5photon>();ではなく、そのparentのコンポーネントを取得する必要があるので envPlaymove5photon= other.transform.root.gameObject.GetComponent<EnvPlaymove5photon>();にしなければならないことに気づく。
下記のように編集し、Debug.Log("DebuffcheckSucces1”);はきちんと通過していることが確認できた。
envPlaymove5photon.rabitslowflagのtrueを異なるシーンオブジェクトから読み取らせるためには事前にphotonでrabitslowflagの内容を共有させておかないといけないのでこちらはRPCを使用する。
if (photonView.IsMine)
{
charaModeManager = other.GetComponent<CharaModeManager>();
GameObject rootobj = other.transform.root.gameObject;
envPlaymove5photon = rootobj.GetComponent<EnvPlaymove5photon>();
Debug.Log(envPlaymove5photon);
Debug.Log(charaModeManager);
if (envPlaymove5photon == null)
{
Debug.Log("Debuffcheck2");
return;
}
else
{
Debug.Log("DebuffcheckSucces1");
if (envPlaymove5photon.rabitslowflag)
{
Debuffcheck();
Debug.Log("DebuffcheckSuccess2");
}
}
Actionlistの方を下記のように変える。これで各シーンの攻撃側のenvPlaymove5photon.rabitslowflagの値が統一されるはず。
public void Rabbitskill4()
{
//envPlaymove5photon = myPlayer.GetComponent<EnvPlaymove5photon>();
//envPlaymove5photon.rabitslowflag = true;
photonView.RPC(nameof(Rabbitskill4photon), RpcTarget.All);
}
[PunRPC]
void Rabbitskill4photon()
{
envPlaymove5photon = myPlayer.GetComponent<EnvPlaymove5photon>();
envPlaymove5photon.rabitslowflag = true;
}
攻撃実行時public void Rabbitskill4()でNullReferenceException: Object reference not set to an instance of an objectのエラーが発生。
DeerActionlistはそもそもUIにつけるものなので、EnvPlaymove5photonスクリプト内でRPCは実行させるべきだった。
public void Rabitslowflag()
{
photonView.RPC(nameof(Rabbitskill4photon), RpcTarget.All);
}
[PunRPC]
void Rabbitskill4photon()
{
rabitslowflag = true;
}
public void Rabbitslow()
{
StartCoroutine("Rabbitslowfunc");
//rabitslowflag = true;
}
IEnumerator Rabbitslowfunc()
{
rabbitspeedup = 0.8f;
yield return new WaitForSeconds(2);
rabbitspeedup = 1;
//rabitslowflag = false;
Debug.Log("rabitslowflagfalse");
}
これでスッキリしたのではないか。
無事にデバフ効果が入り IEnumerator Rabbitslowfunc()のrabitslowflagfalseまで確認できた。