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

풀매니저 대신 타일맵 제너레이터

by pudding81 2024. 4. 8.

아이템 효과들의 적용을 위해서 

오브젝트 풀링 -  타일맵 재사용 대신 // 풀 매니저, 타일매니저 적용 X

타일맵 제너레이터- 타일맵의 생성 삭제로  변경 

 

타일맵제너레이터 

-타일맵 생성 

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

public class TileMapGenerator : MonoBehaviour
{
    //public int maxindex;

    // 난수생성기
    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;



    public TileMapController[] tiles;


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

        {

            

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

        }

    }




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

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

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

            //Debug.Log(randomIndex);

            Vector2 pos = new Vector2(21.49f, 0);

            

          Instantiate(tiles[randomIndex],pos,Quaternion.identity);


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

        }


    }


    //타일맵 랜덤 번호를 생성하고 저장
    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 값으로 복원
    }
}

 

 

타일맵 컨트롤러 

- 타일맵 삭제

 

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



public class TileMapController : MonoBehaviour //,IPoolObject // 아이풀 인터페이스 구현
{
    TileMapGenerator generator;
   // TileManager tileManager;
   // PlayerController player;
    
    public float speed=4f;

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

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

    private void Start()
    {

         generator = GameObject.FindAnyObjectByType<TileMapGenerator>();

        // tileManager = GameObject.FindAnyObjectByType<TileManager>();
        // player = FindAnyObjectByType<PlayerController>();



    }

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

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

        
      


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

           // ReturnGoPool();
           
        }

        

    }


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


    //    tileManager.ReturnPool(this);


    //}


    //void Init()
    //{

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



    //}


    //public void OnCreatedInPool()
    //{

    //}

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