본문 바로가기
유니티

유니티 13일차

by 육지상어 2021. 3. 6.
728x90
반응형

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cMemoryPool : MonoBehaviour
{
// 메모리풀(오브젝트 풀링)
// - Instantiate(생성), Destroy(제거)는 비용이 큼
//(컴퓨터에 무리를 주게 됨)
// - Destroy(제거)를 해도 메모리를 바로 해제하지 않음
// - 미리 오브젝트를 생성하고 SetActive를 이용하여
//활성화, 비활성화 하여 오브젝트를 재활용하는 방식인
//메모리풀(오브젝트 풀링)이 최적화에 좋음
// - 총알, 미사일, 이펙트, 적군(리스폰형식)에 주로 사용됨
// - 최적화만 고려하다가 반드시 삭제해야할 오브젝트
//(ex.Boss, 1회용 몬스터) 를 오브젝트 풀링으로 사용하는 것은
//오히려 더 비효율적임(삭제가 필요하다면 삭제해주어야함)

public GameObject Bullet; //총알 오브젝트

public int max = 10; //오브젝트 풀에 생성할 총알 갯수
public List<GameObject> BulletPool = new List<GameObject>();

Vector3 pos;

void Awake()
{
    CreatePool();//오브젝트 풀링 함수 호출
}

void Update()
{
    pos = transform.position;//현재 오브젝트의 위치를 pos에 대입

    if (Input.GetKeyDown(KeyCode.A))
    {
        GetBullet(); //A키를 누르면 총알을 생성
    }
}

public GameObject GetBullet()
{
    for (int i = 0; i < BulletPool.Count; i++)
    {
        if (BulletPool[i].activeSelf == false)
        //비활성화된 총알이라면
        {
            BulletPool[i].gameObject.SetActive(true); //활성화 시켜줌
            BulletPool[i].transform.position = pos; //생성 위치 지정
            return BulletPool[i]; //총알을 반환
        }
    }
    return null; //비활성화된 총알이 없다면 null을 반환
}

public void CreatePool()
{
    GameObject MemoryPools = new GameObject("Memorys");
    //부모 오브젝트생성(하이어라키에서 관리가 용이)

    for (int i = 0; i < max; i++)
    {
        GameObject obj = Instantiate(Bullet, MemoryPools.transform);
        //총알 생성
        obj.name = "Bullet_" + i.ToString("00");
        //이름 변경
        obj.SetActive(false);
        //비활성화
        BulletPool.Add(obj);
        //리스트에 추가
    }
}

}

씨 메모리 풀이라는 걸 적어서 스크립트를 맍들어주자.
오브젝트 풀링. 메모리 관리에 관한 스크립트다. 재할용을 해서 새 메모리 할당에 대해 생각을 해보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cBullet : MonoBehaviour
{
void OnEnable()
//오브젝트 활성화시
{
StartCoroutine("ObjectEnd");
}

// Update is called once per frame
void Update()
{
    transform.Translate(Vector3.forward * 5.0f * Time.deltaTime);
}
IEnumerator ObjectEnd()
{
    yield return new WaitForSeconds(5.0f); //5초후
    gameObject.SetActive(false); //총알 비활성화
}

}

씨피유 자원을 많이 소모하는것을 보는 ui가 있는데, 메모리
그래프가 갑자기 뛰게 될때 있는데 가비지 컬렉션이 동작한거임 그게 점점 주기가 짧아짐
그걸 미리 컨트롤하려면 활성화 비활성을 해서 관리한다.

스피어를 만들어준다. 하이라이키 창에 있는 스피어를 에셋에 넣고 지운다.
빈 오브젝트를 만들고, 씨메모리풀에 넣ㅅ고 스피어를 넣는다.

활성화 비활성화 방식임

큐브를 하나 만들어주고 큐브 위치 초기화

오큘러 스테틱, 오큘러 디 스테틱을 체크해준다.

윈도우 -> 렌더링 -> 오큘러 쿨링 -> 베이크

큐브는 활성하하고 있는데, 카메라에서 벗어나면 렌더링을 안하는 기능
즉, 오브젝트 메모리 관리. 살짝만 보여도 랜더링함

씨 큐브라는 스크립트를 만들고, 씨 스피어란 스크립트를 만든다.

큐브에다가 씨 큐브를 넣고, 또 스피어를 하나 만들어준다. 그걸 또 씨 스피어를 넣어준다.

스피어부분에 큐브 오브젝트를 넣어준다.
즉 오브젝트 안에 함수나 변수를 참조하는 import 개념을 해본거임
겟 컴퍼넌를 사용할때는 업데이트보단 처음 선언

뉴 씬을 하나 만들어준다.Rhythm

cNote를 스크립트 만든다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cNote : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Destroy(gameObject, 5.0f);
}

// Update is called once per frame
void Update()
{
    transform.Translate
        (Vector3.down * 5 * Time.deltaTime);
}

}

그리고 큐브를 만들고 Y 스케일을 0.3 리디드바디를 하고, 그래비티를 꺼준다.

노트를 에셋화 해준 후, 저장

캘슐을 만들고 A_key라 지정해준다.

포지션을 -4 -2
각도를 z를 90
스케일을 0.5 1 1

캡슐 콜라이더 레디어스 0.2, 리지드바디 추가하고 유즈 그라비티 끄고 이즈 키네틱 켜줌

하고 컨트롤 D를 눌러 복제한다.

키에다가 Ckey를 넣고, 노트에다가 cnote를 넣고,

빈 오브젝트를 하나 만들어 게임매니저를 넣고, 해준다.

  1. HP 기능 구현
  • 노트 놓치면 HP 깎임
  • 노트 맞추면 HP 늘어남

2.
키를 누를때마다 이펙트 활성화
에셋스토어에서 무료 이펙트 다운받기

  1. 배경 키 노트 이미지 변경

  2. 콤보기능 구현
    키를 누를때마다 콤보가 쌓임
    노트를 놓치면 콤보 초기화
    콤보가 점수에 추가됨

반응형

'유니티' 카테고리의 다른 글

유니티 16일차  (0) 2021.04.04
유니티 15일차  (0) 2021.03.28
유니티 11일차  (0) 2021.02.28
유니티 10일차  (0) 2021.02.28
유니티 9일차  (0) 2021.01.24

댓글