화면 안에 안 보이게만 하는 것이 아니라 존재 자체를 없애는 기능 (Alt + Shift + A)
obj = GameObject.FindGameObjectWithTag("Player");
objTf = GameObject.FindGameObjectWithTag("Player").transform;
// obj의 GameObject 활성상태를 False
obj.SetActive(false);
// 형 변환 (Transform 타입 -> GameObject 타입)
objTf.gameObject.SetActive(false);
Object 자체를 활성화시켰기 때문에 인스펙터 창에서 체크가 풀려있음
[Object 복습]
유니티의 기본단위 : 게임 오브젝트 (GameObject)
모든 GameObject는 Transform 컴포넌트를 갖는다.
3. 컴포넌트(Component) 추가
using UnityEngine;
public class StudyComponent : MonoBehaviour
{
public GameObject obj;
public Mesh msh;
public Material mat;
public void CreateCube()
{
// obj = new GameObject();
// obj.name = "Cube";
obj = new GameObject("Cube");
obj.AddComponent<MeshFilter>();
obj.GetComponent<MeshFilter>().mesh = msh;
obj.AddComponent<MeshRenderer>();
obj.GetComponent<MeshRenderer>().material = mat;
obj.AddComponent<BoxCollider>();
}
void Start()
{
// 1. void 구현해서 Cube 생성
//obj = new GameObject("Cube");
//obj.AddComponent<MeshFilter>();
//obj.GetComponent<MeshFilter>().mesh = msh;
//obj.AddComponent<MeshRenderer>();
//obj.GetComponent<MeshRenderer>().material = mat;
//obj.AddComponent<BoxCollider>();
// CreateCube();
// 2. Unity 기본 메소드 활용
obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
}
}
코드를 실행시키면 Cube가 생성됨을 확인할 수 있다.
이렇게 유니티 에디터를 통해서 Cube를 생성하지 않고 스크립트를 통해서도 Object를 생성할 수 있다.
4. Prefab 활용
🥕 예행 작업 1. Scene 생성 (GameObject and Prefab) 2. Script 생성 (StudyGameObject) 3. 빈 오브젝트 생성 (Spawner)
4.1. GameObject 생성
using UnityEngine;
public class StudyGameObject : MonoBehaviour
{
public GameObject prefab;
public Vector3 pos;
public Quaternion rot;
void Start()
{
// GameObject를 생성하는 기능
GameObject obj = Instantiate(prefab, pos, rot);
obj.name = "R.E.P.O 캐릭터";
}
}
4.2. GameObject 삭제 1
public GameObject destroyOb;
void Start()
{
// 매개 변수로 들어간 게임 오브젝트를 파괴하는 기능
Destroy(destroyOb, 3f); // 3초 뒤 파괴
}
해당 코드를 실행시키면 Plane 오브젝트가 삭제됨
4.3. GameObject 삭제 2
🥕 예행 작업 1. Script 생성 (DestroyEvent) 2. Cube, Sphere, Capsule 생성
using UnityEngine;
using UnityEngine.Assertions.Must;
public class DestoryEvent : MonoBehaviour
{
public float destroyTime = 3f;
void Start()
{
Destroy(this.gameObject, destroyTime);
}
// OnDestroy()는 Update()나 Start()처럼 Unity가 자동으로 실행해주는 함수
// 그래서 호출하지 않아도 콘솔창에 나타남
private void OnDestroy()
{
Debug.Log($"{this.gameObject.name}이 파괴되었습니다.");
}
}
▶ Destroy 예시
FPS 게임에서 총알을 삭제할 때 사용 됨
폭발 효과
5. GetChild (자식 오브젝트)
'Repo'라는 Prefab 이하에는 여러 개의 자식 오브젝트가 있다.
public void CreateREPO()
{
GameObject obj = Instantiate(prefab);
obj.name = "R.E.P.O 캐릭터";
Debug.Log($"{obj.name}이 생성되었습니다.");
Transform objTf = obj.transform;
int count = objTf.childCount;
//Debug.Log($"캐릭터의 자식 오브젝트의 수 : {obj.transform.childCount}");
//Debug.Log($"캐릭터의 자식 오브젝트의 수 : {objTf.childCount}");
Debug.Log($"캐릭터의 자식 오브젝트의 수 : {count}");
Debug.Log($"캐릭터의 첫번째 자식 오브젝트의 이름 : {objTf.GetChild(0).name}");
Debug.Log($"캐릭터의 마지막 자식 오브젝트의 이름 : {objTf.GetChild(obj.transform.childCount - 1).name}");
}
}
GetChild 함수를 통해서 해당 오브젝트의 자식 오브젝트를 확인할 수 있다.
6. 캐릭터 이동 성능(Movement) 업그레이드
6.1. Input Manager
Input System(Old - Legacy)은 입력값에 대한 약속된 시스템을 뜻한다.
예시 - 이동 : WASD, 방향키 - 점프 : SpaceBar - 총쏘기 : 마우스 왼 클릭
6.2. Unity 에디터 우측 하단에 버튼을 통해서 Input Manager에 접근 가능
Positive Button을 보면 어떤 키로 작동하는지 확인할 수 있다.
6.3. Input System을 활용해보쟛~
using UnityEngine;
public class Movement : MonoBehaviour
{
public float moveSpeed = 5f;
void Update()
{
float h = Input.GetAxis("Horizontal"); // 수평 (좌우)
float v = Input.GetAxis("Vertical"); // 수직 (위아래)
Vector3 dir = new Vector3(h, 0, v);
Debug.Log($"현재 입력 : {dir}");
transform.position += dir * moveSpeed * Time.deltaTime;
}
}
이전 코드에 비해 엄청 단순해졌음을 확인할 수 있다.
이 외에도 캐릭터가 기존에는 좀 딱딱하게 움직였다면 GetAxisr는 [-1,0,1] 사이의 값을 반환하기 때문에 훨씬 부드러워졌다.
Destroy 스크립트 비활성화를 안 해서 ㅋㅋ.. 갑자기 오브젝트들이 다 삭제됨
저런 오브젝트들을 통과 못하게 한번 구현해서 움직여보는 것도 괜찮은 복습일 듯?
2. C# 기초 학습(5)
1. 매개변수
public void AddMethod(int num1, int num2)
{
int result = num1 + num2;
}
void Start()
{
AddMethod(10, 20);
}
# 오버로드(Overload) = 매개변수 타입만 다른 함수 3종
public void OnMethod(int a) {}
public void OnMethod(float a) {}
public void OnMethod(string a) {}
num1, num2 = 매개 변수 = Parameter(인자) = 함수를 정의할 때 사용되는 변수
10, 20 = 전달 인자 = Argument(인자) = 함수가 호출될 때 사용되는 변수 값
이렇게 매개변수를 사용하냐 안 하냐에 따라 기능이 조금씩 달라짐!
강사님께서 수업 시작하고 한 시간 정도? 는 복습을 해주시는데 듣다가 맨날 멍 때리고 어느 순간 진도 나가고 있는 걸 발견함
얼레리? 부랴부랴 강사님 노션이나 디코보고 타자 와다다 치고 정리 와다다 매번 정신이 없음!!
그런데 강사님이 이 글을 봐주실지 모르겠지만.. 복습양을 조~금만 줄여주시길.. 간곡히 부탁드리고 싶다!!
매번 말하지만 넘 불안함.. 책에 있는 내용, 인강에 있는 내용들만 배우고 끝날까 봐... 응용이 필요한 것들은 알아서 해라! 이럴까 봐..
물론 여쭤보면 친절하게 알려주실 것 같기는 한데 수강생이 120명인데..!? 현실적으로 힘들 것 같다.
나는 그냥 복습은 알아서 하라 시키고.. 좀 더 실무에서 많이 쓰는 기능적인걸 많이 보여주셨음 하는 그런 바람이..
근데 지금은 이거보다 더 큰 문제가 발생함
오늘 이야기 들어보니까 회고팀 정해지면 팀원끼리 복습하는 거 같던데 나 같은 파워 I가 잘 적응할 수 있을지 모르겠다..