private void Start() //오브젝트 미리 생성하는 과정.
{
poolDictionary = new Dictionary<string, Queue<GameObject>>();
if (!PhotonNetwork.IsMasterClient) return; <- 마스터일때만 생성
foreach (Pool data in datas)
{
Queue<GameObject> objectPool = new Queue<GameObject>();
for (int i = 0; i < data.initialSize; i++)
{
GameObject obj = PhotonNetwork.Instantiate(data.name, Vector3.zero, Quaternion.identity); <- 포톤 네트워크로 생성
obj.transform.SetParent(objPoolTransform, false);
obj.GetComponent<PhotonView>().RPC("SetActiveRPC", RpcTarget.All,Vector3.zero, Quaternion.identity, false);
objectPool.Enqueue(obj);
}
poolDictionary.Add(data.name, objectPool);
}
}
public GameObject Get(string name, Vector3 position, Quaternion rotation) //오브젝트를 꺼내쓰는것.
{
GameObject obj = poolDictionary[name].Dequeue();
obj.GetComponent<PhotonView>().RPC("SetActiveRPC", RpcTarget.All, position, rotation, true);
poolDictionary[name].Enqueue(obj);
return obj;
}
지금 임시로 쓰고있던 Get인데 이제 이걸 수정해야함.
1) 마스터가 풀에서 오브젝트를 생성하고 이걸 딕셔너리에 집어넣음 -> 클라이언트는 당연히 딕셔너리가 비어있음
2) 클라이언트가 Get으로 요청하는 상황발생 -> 마스터가 해당 name을 키값으로해서 대신 그걸 풀에서 꺼내줘야함
3) 근데 그러면 저 return obj에서 obj에 어떻게 넣지?????
4) 저 Get으로 오브젝트를 반환한 다음에 그 오브젝트에 Init() 함수같은 초기화 함수로 풀에서 꺼낸 오브젝트를 초기화해줘야함 당연히.
근데 문제는 클라이언트 입장에서 Get으로 마스터한테 대신 꺼내달라고 요청한 다음에 그 대신꺼내준 오브젝트를 반환받을 방법을 모르겠음.
var item = ObjectPoolManager.Instance.Get("Item", args.point, Quaternion.identity);
item.GetComponent<PhotonView>().RPC("InitializeItem", RpcTarget.All, monster.DropItem);
그러니깐 이렇게 풀에서 Get으로 꺼내온 아이템을 반환받아서 거기에 초기화함수를 호출해야 하는데 클라이언트가 이걸 어떻게 받아와야할지 모르겠음.
마스터가 대신 풀에서 꺼내줘도 그걸 클라이언트가 어떻게 가질 수 있을까?? -> RPC함수를 마스터한테 요청해도 rpc로 호출한 함수는 반환타입도 무조건 void고 out 키워드도 안됨.
마스터에서만 생성하는 이유는? - dc App
1. 마스터에서 딕셔너리 초기화 할 때 클라이언트에서도 딕셔너리 채워넣기 2. 마스터에서 꺼낼 때 클라이언트에서 생성할 수 있게 값 넘겨주기
마스터에서 생성하고 그게 클라이언트에 동기화되는 구조면 저 딕셔너리에 넣어주면서 약간의 딜레이 후에 rpc로 오브젝트의 포톤 뷰 id를 전달해 그리고 그걸 클라가 딕셔너리에 넣고 약간의 딜레이 후가 싫다면 포톤 네트워크의 Instantiate 코드 들어가서 생성되고 전달 후에 rpc 전달 ㄱㄱ
그리고 포톤 자체에서 오브젝트 풀링 제공해주는것도 있으니 그것도 참조하고
포톤 퓨전을 쓰는것도 좋다고 생각을 해요