본문 바로가기
게임프로젝트/쿠키런 모작

R&D 타일맵 랜덤 무한 생성(4) 오브젝트 풀링 수정중

by pudding81 2024. 3. 30.

 
 
 

¤오브젝트 풀링 풀 반환 수정

 

-풀 반환 부분을 수정했더니 타일맵이 다음 순번에 반환됨.
- 하지만 플레이어와 충돌한 아이템들이 사라짐(Destroy)

- 플레이어와 아이템이 충돌하면 아이템을 비활성화 하고 풀에서 꺼낼때 활성화 코드를 넣었지만 에러남
=> 아이템 컨트롤러를 추가하고  활성화  비활성화 코드를 넣어줌

 

 

 
 
타일맵 컨트롤러 // 타일맵 프리팹에 부착

using Redcode.Pools;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;



public class TileMapController : MonoBehaviour ,IPoolObject // 아이풀 인터페이스 구현
{
    TileManager tileManager;
    

    public float speed=4f;

    private float tileWidth = 17.88f; // 타일맵의 가로 길이

    public string idname; // 타일맵 풀 이름

    private void Start()
    {
        tileManager = GameObject.FindAnyObjectByType<TileManager>();
    }

    void Update()
    {
        // if (!GameManager.instance.isGameOver) 게임오버가 아니면



        //게임오브젝트를 왼쪽으로 움직임
        this.transform.Translate(Vector3.left * speed * Time.deltaTime);



        // 화면 밖으로 벗어나면 비활성화 / 풀에 반환 
        if (transform.position.x < -tileWidth)
        {
           
            gameObject.SetActive(false);

           ReturnGoPool();
           
        }

        

    }


    void ReturnGoPool()
    {
        // 오브젝트 풀에 반환합니다.
        //Debug.Log("testpooling 반환 호출 ");
     
        
        tileManager.ReturnPool(this);

       
    }


    void Init() 
    {

            //생성 위치
            //오브젝트가 성공적으로 가져와졌다면, 여기서 추가 작업을 수행합니다.
            transform.position = new Vector2(tileWidth, 0);
           //  예를 들어, 오브젝트의 위치를 설정합니다.
       
        

    }


    public void OnCreatedInPool()
    {
      
    }

    public void OnGettingFromPool() //재사용
    {
        // 타일맵 생성 코루틴 
        Init();
    }
}

   
 
타일매니저
- 타일맵 생성 코루틴
- 타일맵 순서 시드대로 무한 생성 
 

using Redcode.Pools;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEditor.EditorTools;
using UnityEngine;

public class TileManager : MonoBehaviour
{
    PoolManager poolManager;
   


    // 난수생성기
    public long seed = 6; // 0 ~ 9223372036854775807 (long 타입의 양수 범위)
    private int minNumber = 0; //타일맵 인덱스 최소범위
    public int maxNumber = 6; //타일맵 인덱스 최대범위
    //필요한 임의의 숫자들의 총 개수// 타일맵의 길이
    private int iterations = 99;
    //이미 생성된 임의의 숫자들의 리스트
    private List<int> results = new List<int>();

    // LCG Parameters
    // seed, a, c, m은 난수 생성 알고리즘에 사용되는 변수들로,
    // 각각 초기값, 곱셈 상수, 덧셈 상수, 모듈로 상수를 나타냅니다. 
    private const long a = 1103515245;
    private const long c = 12345;
    private const long m = 2147483647;


    private int count = 0;

    private void Awake()
    {
        poolManager = GetComponent<PoolManager>();
        
    }



    private void Start()
    {

        GenerateRandomNumbers();


        // 타일맵 생성 코루틴 
        StartCoroutine(CreateTileMap());



    }


  

    IEnumerator CreateTileMap() // 딜레이 시간마다 무한 생성 
    {

        while (true)
        {

            

            //int randomIndex = UnityEngine.Random.Range(0, 4); // 랜덤 인덱스 생성

            // 게임을 시작 할때마다 타일맵을 순서대로 활성화함
            int randomIndex = results[count];

            TileMapController tileMap = poolManager.GetFromPool<TileMapController>(randomIndex);
            // 여기서 randomIndex는 풀의 인덱스입니다.

            //  Debug.LogFormat("맵 번호 {0}", randomIndex);

           // 타일맵 인덱스를 순서대로 반복한다.
            count++;
            yield return new WaitForSeconds(4.5f);

        }


    }

    public void ReturnPool(TileMapController tileMap)
    {

       
        // Debug.Log("풀에 반환");
        // 오브젝트를 풀에 반환합니다.
        poolManager.TakeToPool<TileMapController>(tileMap.idname, tileMap);
       


    }





    //타일맵 랜덤 번호를 생성하고 저장
    void GenerateRandomNumbers()
    {
        long originalSeed = seed; // 초기 seed 값을 임시 변수에 저장
        results.Clear();
        for (int i = 0; i < iterations; i++)
        {
            seed = (a * seed + c) % m; // 현재 seed를 사용하여 난수 생성
            int randomNumber = minNumber + (int)(seed % (maxNumber - minNumber + 1));
            results.Add(randomNumber);
        }
        seed = originalSeed; // 난수 생성 후 원래 seed 값으로 복원
    }

}