//tips
//ゴーレム同期対応
新規ゴーレムの追加に対応して、Golemfollowスクリプトを異なるgolemfollowオブジェクトでも使用できるように、dropitem名で検索するオブジェクトを変える。
void Update()
{
Vector3 offset = new Vector3(0, 3, 0);
if(dropitem.name == "dropitem")
{
golem = GameObject.Find("Polygonal Golem Orange (1)(Clone)");
if (golem != null)
{
if (!dropflag)
{
this.transform.position = golem.transform.position + offset;
}
}
}
if (dropitem.name == "dropitem2")
{
golem = GameObject.Find("Polygonal Golem Orange (2)(Clone)");
if (golem != null)
{
if (!dropflag)
{
this.transform.position = golem.transform.position + offset;
}
}
}
if (dropitem.name == "dropitem3")
{
golem = GameObject.Find("Polygonal Golem Orange (3)(Clone)");
if (golem != null)
{
if (!dropflag)
{
this.transform.position = golem.transform.position + offset;
}
}
また、HPscript2の方も消滅時に参照するオブジェクトを追加する。
if (hp <= 0)
{
Debug.Log(gameObject.name);
if (gameObject.name == "Polygonal Golem Orange (1)(Clone)")
{
Debug.Log("GohlemSoul");
Golemfollow Golemfollow = GameObject.Find("GolemOrangefollow(Clone)").GetComponent<Golemfollow>();
Golemfollow.Dropgolemitem();
}
if (gameObject.name == "Polygonal Golem Orange (2)(Clone)")
{
Debug.Log("GohlemSoul");
Golemfollow Golemfollow = GameObject.Find("GolemOrangefollow2(Clone)").GetComponent<Golemfollow>();
Golemfollow.Dropgolemitem();
}
if (gameObject.name == "Polygonal Golem Orange (3)(Clone)")
{
Debug.Log("GohlemSoul");
Golemfollow Golemfollow = GameObject.Find("GolemOrangefollow3(Clone)").GetComponent<Golemfollow>();
Golemfollow.Dropgolemitem();
}
photonView.RPC(nameof(DestroyObj), RpcTarget.All);
//Destroy(this.gameObject); //ゲームオブジェクトが破壊される
}
ゴーレム破壊時のドロップアイテムの出現場所がおかしいこと、なぜかドロップアイテムが触れていないので非表示になっていること、プレイヤーの頭上に保有しているドロップアイテムが表示状態で浮かんでいることなどの問題が発生しているので順次解決する。
まずGolemfollowスクリプトのif(dropitem.name == "dropitem”)のfindの仕方できちんと自身が保有しているオブジェクト名を取得できているのかをデバッグで確認する必要はある。
デバッグではしっかりdropitemのnameが確認できた。
ヒエラルキーの名前をよく見てみると生成するゴーレムが全てPolygonal Golem Orange (1)になっていたので、そちらを(2),(3)に修正。
var vg = new Vector3(33, 5, 110);//ゴーレム生成
PhotonNetwork.Instantiate("Polygonal Golem Orange (1)", vg, Quaternion.identity);
var vgf = new Vector3(33, 8, 110);//ゴーレムfollow生成
PhotonNetwork.Instantiate("GolemOrangefollow", vgf, Quaternion.identity);
var vg2 = new Vector3(32, 5, 110);//ゴーレム生成
PhotonNetwork.Instantiate("Polygonal Golem Orange (2)", vg2, Quaternion.identity);
var vgf2 = new Vector3(32, 8, 110);//ゴーレムfollow生成
PhotonNetwork.Instantiate("GolemOrangefollow2", vgf2, Quaternion.identity);
var vg3 = new Vector3(31, 5, 110);//ゴーレム生成
PhotonNetwork.Instantiate("Polygonal Golem Orange (3)", vg3, Quaternion.identity);
var vgf3 = new Vector3(31, 8, 110);//ゴーレムfollow生成
PhotonNetwork.Instantiate("GolemOrangefollow3", vgf3, Quaternion.identity);
こちらで再度動作を確認していく。
下記のエラーからリソースフォルダ下に入れてあるprefabがうまく参照されていないことがわかる。
DefaultPool failed to load "Polygonal Golem Orange (2)". Make sure it's in a "Resources" folder. Or use a custom IPunPrefabPool.
UnityEngine.Debug:LogError(Object)
NullReferenceException: Object reference not set to an instance of an object
Photon.Pun.DefaultPool.Instantiate (System.String prefabId, UnityEngine.Vector3 position,
Prefabの名前を少し変更して再度トライ。それでもエラーが出たので検索してみるとphoton特有の問題のよう。私の場合はprefabを複製したから起こったのかもしれない。
https://forum.photonengine.com/discussion/16037/non-resource-located-network-prefabs
https://forum.photonengine.com/discussion/comment/52580#Comment_52580
Prefabを再度インポートしたり、スクリプトとunityを行き来すると治るなどの解決方法があるとのこと。
生成したprefabの名前を全コピーして再度スクリプトに貼り付けると半角のスペースがunityの方で追加されていることがわかり、そこを反映してあげると無事に3体のゴーレムを生成することができた。
今まで生成できなかったのは名前指定が正確ではないと判断されていたためだと分かった。
これにより3体のゴーレムを倒すと各々がアイテムを倒された位置にsoulをドロップするようになった。