1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoBehaviour
{
private static ObjectPool instance;
private string[] assetNames = {"axe", "hammer", "machete"}; //프리팹 이름 배열
private List<GameObject> assetList; //나중에 찾아서 반환시켜야하니까 배열 만들어서 찾기 편하게 한 것
void Start()
{
ObjectPool.instance = this;
this.assetList = new List<GameObject>();
}
public static ObjectPool GetInstance()//싱글톤
{
return ObjectPool.instance;//인스턴스는 하나만 만들어서 한개의 인스턴스만 반환
}
public void LoadAllAssets() //프리팹을 찾아서 게임오브젝트로 만들어서 로드
{
foreach(var assetName in this.assetNames)
{
//프리팹 이름 배열을 이용하여 경로를 만든다
string path = "Prefab/" + assetName;
//경로를 이용하여 Resources 안에 있는 프리팹을 변수에 할당(게임오브젝트로 타입 변경)
var prefab = Resources.Load(path) as GameObject;
//찾은 프리팹을 게임오브젝트로 만들어서 할당
var asset = Instantiate<GameObject>(prefab);
//찾기 편하게 만든 무기오브젝트 배열에 만든 프리팹 게임오브젝트를 추가
this.assetList.Add(asset);
//위에서 찾은 프리팹을 게임오브젝트 만든 것의 이름을 설정
asset.name = assetName;
//게임오브젝트 만든 것의 부모로 지금 오브젝트로 설정
asset.transform.SetParent(this.transform);
//만든 게임오브젝트 비활성화 => 나중에 쓸때 따로 활성화 시켜서 사용
asset.SetActive(false);
}
}
public GameObject GetAsset(string name) //이름을 전달받으면 게임오브젝트 찾아서 반환시켜 줌
{
//무기오브젝트 배열에서 전달받은 매개변수와 같은 게임오브젝트를 찾는다.
var asset = this.assetList.Find(x => x.name == name);
//찾은 게임오브젝트를 떼어서 반환시켜줘야하기 때문에
//지금 오브젝트에서 찾은 자식을 떼어준다
if(asset != null)
{
asset.transform.SetParent(null);
}
//붙여준 부모에서 떼어냈으니 값을 반환시킨다
return asset;
}
public void ReleaseAsset(GameObject asset) //다 사용하고 떼어 낼 매개변수인 게임오브젝트를 전달받아 자식으로 다시 붙여준다
{
//게임오브젝트를 비활성화 시킨다
asset.SetActive(false);
//비활성화 시킨 게임오브젝트를 다시 붙여준다
//지금 오브젝트를 부모로 전달 받은 걸 자식으로 넣기
//하지만 바로 부모로 붙히고 위치를 바꾸면 초기화가 안됨
//먼저 떼어준다
asset.transform.parent = null;
//오브젝트의 위치를 다시 원상태로 초기화시킨다 Vector3 (0, 0, 0)
asset.transform.localPosition = Vector3.zero;
//Rotation을 바꿔주면 칼등으로 때린다 함, 밑에는 안해도되므로 주석
//asset.transform.localRotation = Quaternion.Euler(Vector3.zero);
//위치도 초기화 시켰으니 다시 전달받은 오브젝트를 자식으로 지금 오브젝트를 부모로 설정
asset.transform.SetParent(this.transform);
}
}
|
cs |
'c# > 수업내용' 카테고리의 다른 글
캐릭터, 무기 선택해서 씬로드 실행하기 (0) | 2020.05.15 |
---|---|
캡쳐해서 아이콘 따는 법 (0) | 2020.05.14 |
2020.05.01 이차원 배열 움직이기 (0) | 2020.05.01 |
2020.04.29 출석 보상 아이템 (0) | 2020.04.30 |
2020.04.24 수업내용 업적과 % 출력 (0) | 2020.04.27 |