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

皆さん、ついに、エアラインでも、サブスクリプションが始まったのはご存じですか? まだ実験段階ですが、ANAが、定額全国住み放題サービスを提供する「ADDress」と組んで、国内線を4回まで定額利用可能 ...

2

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

3

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

4

ついに、noteの月間アクティブユーザー数が4400万人(2020年3月時点)に到達しました。 そもそも、「note」とは、クリエイターが、文章やマンガ、写真、音声を投稿することができ、ユーザーはその ...

5

ボードゲームカフェが1日2回転で儲かるという記事をみつけたので興味を持ち、調べてみました。 まずは、需要がどれくらいあるのか、市場のようすからみていきましょう。 世界最大のボードゲーム市場はドイツで、 ...

-code, VR
-,

Copyright© BUSINESS HUNTER , 2023 All Rights Reserved Powered by AFFINGER5.