🥕 예행 작업 1. Scene 생성 (Array) 2. Script 생성 (StudyArray)
3.1. 인덱스 값 확인
using System.Collections.Generic;
using UnityEngine;
public class StudyArray : MonoBehaviour
{
int[] arrayNumber = new int[5] { 1, 2, 3, 4, 5 };
void Start()
{
Debug.Log($"Array의 첫번째 값 : {arrayNumber[0]}");
Debug.Log($"Array의 세번째 값 : {arrayNumber[2]}");
Debug.Log($"Array의 여섯번째 값 : {arrayNumber[5]}"); // 에러
}
}
3.2. 배열과 리스트 각각 인덱스 접근 방법
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.iOS;
public class StudyArray : MonoBehaviour
{
// Array
int[] arrayNumber = new int[5] { 1, 2, 3, 4, 5 };
// List
List<int> listNumber = new List<int>();
void Start()
{
// Array
Debug.Log($"Array의 첫번째 값 : {arrayNumber[0]}");
Debug.Log($"Array의 세번째 값 : {arrayNumber[2]}");
Debug.Log($"Array의 여섯번째 값 : {arrayNumber[5]}");
// List
listNumber.Add(1);
listNumber.Add(2);
listNumber.Add(3);
listNumber.Add(4);
listNumber.Add(5);
Debug.Log($"현재 List에 있는 데이터 수 : {listNumber.Count}"); // arrayNumber.Length
Debug.Log($"현재 List의 마지막 데이터 : {listNumber[listNumber.Count - 1]}");
}
}
4. 접근제한자
클래스 안에 있는 변수나 함수(메서드)에 누가 접근할 수 있는지 결정하는 키워드
접근 제한자
외부 클래스 접근
자식 클래스 접근
유니티 인스펙터 표시
private
X
X
X (기본 값)
public
O
O
O
protected
X
O
X
SerializeField
X
X
O
// 1
int number1 = 1;
// 2
private int number2 = 2;
// 3
public int number3 = 3;
// 4
[SerializeField]
int number4 = 4;
[SerializeField] int number5 = 5;
▶ 1 (Default)
C# 기본 접근 제한자는 private
number1은 클래스 내부에서만 사용 가능
▶ 2 (Private)
private가 명시되어 있어 클래스 내부에서만 사용 가능
▶ 3 (Public)
public은 외부에서 접근 가능
다른 스크립트나 유니티 인스펙터에서 사용 가능
▶ 4 (SerializeField)
SerializeField는 외부 접근이 안 되는 것을 유니티 인스펙터 창에 노출시켜 설정할 수 있게 해주는 속성
다른 스크립트에서는 사용하지 못함
4.1. 육안으로 확인해 봅시다. (다른 스크립트에서 접근)
🥕 예행 작업 1. ProgrammerA 스크립트 생성 (위 코드와 동일) 2. ProgrammerB 스크립트 생성
using UnityEngine;
using DevA;
public class ProgrammerB : MonoBehaviour
{
//ProgrammerA pA = new ProgrammerA();
public ProgrammerA pA; // 유니티에서는 이미 실체화 되었기 때문에 new 연산자를 사용하지 않음
void Start()
{
//pA.number1 = 10; // private라 불가능
pA.number2 = 20; // public이라 가능
//pA.number3 = 30; // private라 불가능
//pA.number4 = 40; // 유니티 인스펙터창이 아니여서 불가능
//pA.number5 = 50; // 유니티 인스펙터창이 아니여서 불가능
}
}
private나 Serialize로 선언된 변수는 타 스크립트에서 참조하지 못하는 것을 확인할 수 있음
public인 number2 변수만 참조 가능!
▶ 노란 박스 추가 설명
Unity는 모든 MonoBehaviour 컴포넌트를 GameObject에 붙여서 관리
new로 생성하면 Unity에서 관리하지 못함
new로 만든 MonoBehaviour 객체는 씬에 존재하지 않고, Unity의 에디터/인스펙터에서도 보이지 않음
즉, Unity 시스템과 동기화되지 않아서 Start, Update 등 작동하지 않음
따라서 이미 실체화된 컴포넌트를 참조해서 사용함
2. GameObject 접근
🥕 예행 작업 1. Scene 생성 (Component) 2. Script 생성 (StudyComponent) 3. GameObject 생성 (Cube, Study Component)
using UnityEngine;
public class StudyComponent : MonoBehaviour
{
public GameObject obj;
public string changeName;
void Start()
{
obj = GameObject.Find("Main Camera"); // Main Camera 오브젝트를 찾아서 할당하는 기능
obj.name = changeName;
}
}
나는 name을 '아아'라고 설정했는데, 내가 여기서 좀 헷갈렸던 게..
Main Camere 라는 오브젝트를 찾아서 obj에 할당했으니까,
obj에는 'Main Camera'가 연결되고, Change Name에만 '아아'가 나타나는 줄 알았음 근데 둘 다 '아아'라고 나타남..
그냥 오브젝트는 오브젝트고, 이름은 이름인가봄! 그래서 obj 칸에 나타나는 건 이름인 '아아'가 오는 건가봄..
또다시 회고 시간!!
강사님께서 오늘 뭔가 흥미로운 책과 유튜브를 알려주셨다.
처음엔 그냥 저런 게 있나 보다 하고 넘어갔었는데
지금은 "구할 수 없는 책" 이 한마디에 급 관심 상승 ㅎㅋㅋㅋㅋ
찾아보니까 근처 도서관에서 대여 가능한 걸로 확인됐다.
반납 연기까지 하면 최대 30일 빌릴 수 있던데.. 회고 시간에 저 책 빌려서 공부를 해볼까?ㅅ?
추가로 유튭도 하나 알려주셨는데
우리 수업에서는 게임 수학에 대해 깊게 다루지 않는다고 해서 해당 강의를 참고해 보는 것도 좋다 하셨음!
마츠우라 켄이치로 책은 보니까 10년 전 책이라.. 흠~ 과연 요즘 기술이 잘 적혀 있을까? 싶긴 해서..