2017-05-16 1 views
0

나는 첫 번째 러너 게임을 가지고 있습니다. 모든 것이 잘 작동합니다. 그래서,이 질문은 최적화에 관한 것입니다.Unity 러너 게임에서 객체 풀링 구현 (재사용)

내 게임에는 15 개의 플랫폼 (플레이어가 실행되는 도로 프리 패브)이 있습니다. 랜덤하게 임의의 1이 인스턴스화되고 이것이 계속 발생합니다. 플레이어가 몇 개의 플랫폼을 통과하면 왼쪽 플랫폼이 파괴됩니다. 필자는 플랫폼을 추적하고 마지막 플랫폼 프리 패브 (list [0])를 삭제하는 목록을 만들었습니다. 새로운 인스턴스가 미리 인스턴스화됩니다.

게임이 접근함에 따라 빠르게 진행되므로 인스턴스화/파기의 작업이 더 자주 발생합니다.

개체 풀링에 대해 읽었습니다. 나는이 개념을 이해했으며, 게임에서 이것을 사용해야한다는 강한 견해를 가지고 있습니다. 개체 풀을 만듭니다. 잘 작동합니다. 이제 내 문제 -

문제 - 만든 수영장에서 개체를 어떻게 다시 사용해야합니까? 내 게임에서 내가 생각해내는 것은 다음과 같습니다. - 사용자가 남겨 두었던 플랫폼은 앞으로 (사용자가 진행하는 방향) 위치를 바꿔야합니다. 어떻게하면 될까요? https://www.youtube.com/playlist?list=PLLH3mUGkfFCXps_IYvtPcE9vcvqmGMpRK

+0

(오프 스크린) 플랫폼 (예 :'List')이있는 컨테이너를 사용하고 첫 번째 가능한 것을 선택하고 위치를 수정하십시오. – UnholySheep

+0

@UnholySheep - 게임을 예측할 수 없게하고 싶습니다. 플랫폼을 무작위로 사용하고 싶습니다. – Vineet

+0

그 컨테이너에서 임의의 플랫폼을 골라야합니다. 그게 훨씬 더 많은 코드가 아닙니다. – UnholySheep

답변

0

플레이어가 몇 가지 플랫폼을 전달의 파괴 플랫폼 뒤에 도착 왼쪽 -

나는이 자습서를 따라 갔다. 나는 플랫폼을 추적하고 목록 마지막 플랫폼 프리 패브 (list [0])를 삭제하는 목록을 만들었습니다. 새로운 인스턴스가 미리 인스턴스화됩니다.

개체 풀링을 만드는 방법은 여러 가지가 있습니다. 그 중 하나는 객체를 대기열에 추가하고 사용 중에 객체를 제거하는 것입니다. 재활용/폐기하려는 경우 목록에 다시 추가하십시오.


는 어떻게 만들어 풀에서 객체를 재사용해야합니까?

정말 쉽습니다. 대신이 매번 일을 :

Instantiate(prefab, postion, Quaternion.identity); 

게임이 시작 기능에 시작하여 배열/목록에서 다음 저장할 때 여러 번이를 수행하십시오 인스턴스화 할 필요가

List<GameObject> pool = new List<GameObject>(); 

void Start() 
{ 
    for (int i = 0; i < 50; i++) 
    { 
     GameObject tempObj = Instantiate(prefab, postion, Quaternion.identity) as GameObject; 
     pool.Add(tempObj); 
    } 
} 

게임 플레이시 개체 단지 목록/배열에서 하나를 얻을 :

//Check if object is available in pool 
if (pool.Count > 0) 
{ 
    //Object is. Return 1 
    GameObject objFromPool = pool[0]; 
    //Enable the Object 
    objFromPool.SetActive(true); 
} 
else 
{ 
    //Object is NOT. Instantiate new one 
    GameObject objFromPool = Instantiate(prefab, postion, Quaternion.identity) as GameObject; 
    //Enable the Object 
    objFromPool.SetActive(true); 
} 

,

개체 사용이 끝나면.

//Reset Pos 
objFromPool.transform.position = Vector3.zero; 
//Disable? 
objFromPool.SetActive(false); 
//Return back to the array 
pool.Add(objFromPool); 
마지막으로

,이 일을 가장 좋은 방법은 모든 인스턴스를하는 대신 Destroy(objFromPool);을하고, 당신은 다음 List에 다시 추가하려면 아마 또한 그것을 사용하지, 그 게임 오브젝트의 위치를 ​​재설정 객체를 배열 또는리스트에 추가합니다. 증가하는 정수를 사용하십시오. 정수는 0에서 시작하여 list/array.Length-1에 도달 할 때까지 증가합니다. 그런 다음 해당 정수를 사용하여 풀에서 Object를 가져올 수 있습니다.

ArrayObjectPoolinghere으로 구현 된이 메소드의 예와 사용 방법을 볼 수 있습니다.

+1

프로그래머에게 감사드립니다. 그게 내가 필요한거야! – Vineet