관리 메뉴

STIKA-DEV

TIL [42]✏️ 본문

프로그래밍/Unity + C#

TIL [42]✏️

STIKA 2024. 3. 12. 03:32

24.03.12 Mon

 

 

❤️ TIL [42]

Today I Learned


✏️ 작업 내용

✔️ 

✔️ 


✔️ 두둥


리지드바디의 이즈 키네마틱 = 바람에날라다니거나 하는 물리적연산은 안받지만 충돌인식은하겠다


유니티에서 안정성있는 스크립트를 작성하기 위해서는 컴포넌트와 관련된 예외처리가 필수입니다.

다행히도 유니티에는 스크립트 상에서 컴포넌트를 가지고 오거나 추가하는 메소드가 준비되어 있습니다.

그런데 문제는 이 메소드를 제대로 이해하지 못하고 사용한다면 예상치 못한곳에서

낭패를 볼 수 있다는 것인데요.

간단한 예제를 통해서 문제점과 함께 해결 방법에 대해서 이야기 해보도록 하겠습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private MeshRenderer mr = null;     // MeshRenderer 컴포넌트
 
void  Awake() {
    // GetComponent는 해당 컴포넌트가
    // 있으면 해당 컴포넌트를 반환하고,
    // 없다면 null을 반환해주게 됩니다.
    mr = this.GetComponent<MeshRenderer>();
 
    if(mr == null)
    {
        // 만약 해당 컴포넌트가 없는 상황이라면
        // AddComponent를 통해서 컴포넌트를 추가해줄 수 있는데,
        // 정상적으로 추가가 되고나면 해당 컴포넌트를 반환해 줍니다.
        mr = this.gameObject.AddComponent<MeshRenderer>();
    }
    else
    {
        // 만약 해당 컴포넌트가 있는 상태에서
        // AddComponent를 하게되면 null이 반환이 됩니다.
        mr = this.gameObject.AddComponent<MeshRenderer>();
    }
}
cs

위의 소스코드는 MeshRenderer 컴포넌트를 관리하기 위해서 멤버 변수를 선언하고,

스크립트 동작과 동시에 해당 컴포넌트를 가지고 오는 스크립트 입니다.

설명을 위해서 다소 부적절하게 작성되었으니 실제로 사용하실 때는 수정을 하셔야 합니다.

 

매번 실행될 때 마다 MeshRenderer를 가지고 와야하기 때문에 그냥 AddComponent를 사용하면

되지 않겠냐고 생각하시는 분들이 계실겁니다.

하지만 AddComponent의 경우 해당 컴포넌트가 없다면 문제가 발생하지 않지만,

만약 해당 컴포넌트가 이미 추가되어 있는 상태라면 문제가 발생하게 됩니다.

이미 컴포넌트가 있는 상태라면 컴포넌트의 추가를 수행하지 않고,

추가와 동시에 컴포넌트를 반환하는 행위도 하지않기 때문에 그냥 null을 반환하게 됩니다.

즉, 우리가 원하는대로 멤버 변수를 채울 수 없게 된다는 것입니다.

 

이에 반해서 GetComponent의 경우 해당 컴포넌트가 존재한다면 컴포넌트를 반환하고,

그렇지 않다면 null을 반환하게 됩니다.

뭔가 비슷하지만 동작방식이 다르기 때문에 이를 적절히 조합해서 사용하셔야 합니다.

 

만약 컴포넌트가 있는지 없는지를 확정할 수 없는 상황이라면 일단은 GetComponent를 이용해서

해당 컴포넌트가 있는지를 확인한 다음에 그 여부에 맞춰서 AddComponent를 해주면 됩니다.

AddComponent와 GetComponent 레퍼런스는 아래를 참고하시기 바랍니다.

 


다 날리기로함

한 타일에서 밭갈기 씨앗뿌리기 물주기 하루지나면 리셋+작물성장까지 물줘야만 작물성장

타겟설정까지 완성했으나 여러개의 씨앗과 땅을 관리하기엔 적합하지않은 구성이라고 판단해서

다 날리기로했다..

유튜브와 튜터님의 도움을 받아 새롭게 만들어보기로함

딕셔너리에 좌표값으로 키값을 넣을수있을줄은 몰랐지..

셀좌표의 센터 월드값을 받아올수있는게 또 있었다

 

 

 

 

 

 

 


📝 오늘의 마무리

 


 

✏️ 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기

✏️ TIL을 쓰기 위해서라도, 오늘 반드시 단 하나라도 배우기

✏️ 꾸준히 기록을 남기는 습관 가지기

'프로그래밍 > Unity + C#' 카테고리의 다른 글

TIL [44]✏️  (0) 2024.03.14
TIL [43]✏️  (0) 2024.03.13
TIL [41]✏️  (0) 2024.03.11
TIL[40]✏️  (0) 2024.03.09
TIL[39]  (0) 2024.03.08