//tips
//各キャラクターphoton対応継続
Rabbitでのhuman役UIとの連携はできたのでwolf役UIへの反映に移る。
まずは短距離週間移動の実装を行う。これはUIボタンのドラッグ位置を感知するReceiveEventスクリプトとその位置座標を3dに変換しキャラクターに伝達するPlayerFlashスクリプトで表現していたが、prefab生成にし、photonにも対応させるため、receiveEvent.directionfixの値とreceiveEvent.onflash = false;をDeerActionlistスクリプト経由にした後にキャラクターにアタッチしたPlayerFlashスクリプトを実行させるように変更していく。
まずはPlayerFlashスクリプトをrabbitにアタッチ。
ReceiveEventスクリプトのpublic bool onflash = false;をDeerActionlistへ移す。
ReceiveEventスクリプトには[SerializeField]DeerActionlist DeerActionlist;を追加し、参照できるようにする。
DeerActionlist.directionfix = new Vector3(direction.x,0,direction.y);も同様。
public bool onflash = false;の方をキャラクターにアタッチしているPlayerFlashにおき、DeerActionlistから操作した方がよりシンプルなのでそちらは変更。
DeerActionlistはUIにアタッチされているが、自身の操作しているオブジェクトも取得する機能を実装しているのでこのようなことができる。
<UI側>
public void Dragsimulate()
{
heading = movepos - originpos;
var distance = heading.magnitude;
direction = heading / distance;
Debug.Log(direction);
deerActionlist.directionfix = new Vector3(direction.x,0,direction.y);//2dから3dへ変換
Debug.Log(deerActionlist.directionfix);
}
<中継>
public void RabbitWskill1()
{
playerFlash = myPlayer.GetComponent<PlayerFlash>();
playerFlash.direction = directionfix;
playerFlash.onflash = true;
}
<キャラクター側>
void FixedUpdate()
{
if (onflash)
{
transform.rotation = Quaternion.LookRotation(direction);
//rigd.velocity = transform.forward * speed;
rigd.position = transform.position + transform.forward * 3.0f;
onflash = false;
}
}
というように実装し直した。座標同期なのでphotonviewtransformの方で処理してくれる。
きちんと同期シーンのキャラクターも瞬間移動できている。
次に全てのキャラクターに埋め込んでいるparticleを発動させるスクリプトを確認していく。rabbitにParticlePlayarrayスクリプトをアタッチ。FindGameObjectsWithTag("Particles”);でシーン上のキャラクター全てが持つparticleを発動させる。
ただ、こちらは同期先に処理を伝える必要があるので下記のように編集した。
<UI側DeerActionlist>
public void RabbitWskill3()
{
ParticlePlayarray particlePlayarray = myPlayer.GetComponent<ParticlePlayarray>();
particlePlayarray.PreParticleOn();
}
<キャラクター側ParticlePlayarray>
public void PreParticleOn()
{
photonView.RPC(nameof(ParticleOn), RpcTarget.All);
}
[PunRPC]
void ParticleOn()
{
StartCoroutine("PartcleStop");
}
particleが変な位置から発生したバグは子要素の座標位置を修正し、先に入室したシーンで双方にparticle表示させるためにオブジェクトの取得をstartではなく実行メソッド内で行わせることにした。
[PunRPC]
void ParticleOn()
{
particleobjs = GameObject.FindGameObjectsWithTag("Particles");
foreach (GameObject obs in particleobjs)
{
ParticleSystem particle = obs.GetComponent<ParticleSystem>();
particle.Stop();
}
StartCoroutine("PartcleStop");
}
これで無事に全シーンでのparticle実行ができるようになった。