code VR

Unity×VR(135)

スポンサーリンク

//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まで確認できた。

人気の記事

1

コロナによる需要変化 コロナパンデミックの影響で、人々は外に出られなくなり、自宅で過ごす時間が増えました。 この自粛ムードの中、下記のようなビジネスの需要変化が引き起こされています。 【利用者減少】 ...

2

米国レストランの決済時に毎日お世話になっていた「Square」のビジネスモデルについて本日はふれていきたいと思います。 「Square」とは、ネットにつながったモバイル端末と専用のカードリーダーを用意 ...

3

無料でネットショップを開けるアプリとして多くの人に驚きを与えたBASE株式会社が、2019年10月25日東証マザーズに上場しました。2020年2月時点で90万店を超えるショップを抱えるまでに成長してい ...

4

2011年にサービスを開始してから圧倒的な成長率を誇るインテリア通販サイト 【FLYMEe/フライミー】を皆さんご存じでしょうか。 「自分のイメージするインテリア、本当に欲しいインテリアがどこにあるの ...

5

ナイキのSNKRSが、なぜこれほどまでに人気なのか?調べてみました。 きっかけは米国での友達との会話。彼は自分のシューズをみせて、「これ20万円もしたんだぜ。」と語ってくれました。 あまり靴に興味がな ...

-code, VR
-,

Copyright© BUSINESS HACKER , 2021 All Rights Reserved Powered by AFFINGER5.