PinCircle

CJB_ny·2022년 11월 8일
0

PinCircle

목록 보기
1/8
post-thumbnail

일단 게임을 여러가지로 만들기 위해서

FrameWork따로 다 때어 내준다음에

GameScene에서 자동으로 다 생성하는 부분까지 완료함.


일단 반지름 1인 원인 "단위원"이라 가정을 하고 중점으로부터

삼각함수를 사용하여 세타 만큼 이동하면 (x, y) 좌표가 나온다.

https://velog.io/@starkshn/WinAPI-19-%EA%B8%B0%EC%B4%88%EC%88%98%ED%95%99-1-2

조금 흐릿하다면은 읽고오도록 하자.

Pin 위치 설정

현재 Pin의 위치는 Pin의 머리 부분을 기준으로한다.

Pin이 배치 되었을 때 머리에 올 위치가

우리가 게임에서 구현해야할 원의 둘레의 위치이다.

큰원의 반지름 Target Radius + Pin Lenght 를 구하고,

float radius = TargetRadius + PinLenght;

나중에 입력할 degree를 Radian값으로 변경시킬 필요가 있다.

float angle = Mathf.PI * degree / 180

원점 기준으로 구한 위치 값에 과녁의 위치를 더함

Vector3 PinPos = new Vector3(Mathf.cos(angle) * radius, Mathf.sin(angle) * radius, 0) + TargetPos;

Radian

Radian이란?

호의 반지름과 호의 '비율'값이다.

라디안이 실제 계산에서 사용될 값이다.

라디안을 구한다?

계산에 사용될 '각도'를 구한다.

반지름과 둘레 사이의 '비율'을 곧 '각도'로 보는게 '라디안'이라는 '각도'이다.

float angle = Mathf.PI * degree / 180

여기서 입력한 defree를 통해 계산에 사용될 각도, 즉 라디안을 구한다고 했는데

Mathf.PI = 반지름

degree / 180 = 각도 ?

만약 degree = 60이라고 하면은
60 / 180 =? 1/3이다.
이것을 PI에 곱하면 각도는 나오기는 함.


에러

Nullreference 에러 계속났는데

결국 Start, Awake함수 호출 순서 때문에 발생한 문제이다.

https://kukuta.tistory.com/406

Awake

List를 초기화 하는 부분을 Awake가 아니라 이렇게 SetUp함수를 따로 만들어서 초기화 하는 이유는

지금 SpawnThrowAlbePin함수에서 Add함수를 호출 하고있는데

StageController에서도 Awake함수를 통해

SpawnThrowAlbePin함수를 호출 하고있다.

Awake는 PinSpawner가 먼저 호출이 될지 StageController가 먼저 호출 될지 알 수 없기 때문에

StageController에서 SetUp메소드 호출하여 먼저 초기화를 진행한 다음에 SpawnThrowAlbePin함수를 호출 하여 Add를 정상적으로 동작할 수 있게 해주는 것이다.

List가 먼저 초기화 될 수 있도록 제어 하는 것이다.

에러 났던 부분(프리팹 관련)

현재

여기에서 이렇게 유니티 툴에서 드래그 드롭으로 PinSpawner를 등록을 했었고

그 등록한 녀석의 주소를 통해서 SetUp메소드를 호출 하였다.

그리고 씬에 미리 배치된 PinSpawner녀석도 Start함수를 통해 SetUp을 호출하였고

결론은 NullReference에러가 계속 났었는데

내가 객체지향을 이해를 아직 다 못한거같다.

정리

내가 생각한 것을 정리를 하자면은

Scene View에 미리 있는 오브젝트들 부터 Start와 같은 함수가 먼저 호출이 되고

내가 Scene에 배치한 녀석이 나중에 생성이 되면서

Start와 같은 함수가 호출이 된다.

https://gist.github.com/Curookie/d29cd2e774128766591ebed6f201fe0f?permalink_comment_id=2340492

여기 이벤트 호출 순서를 꼭 숙지를 하도록 하자.

Awake는 오브젝트가 생성이 될때 호출이 된다.

코루틴

https://learnandcreate.tistory.com/688

여기서는 yield return null의 동작방식을 좀 볼 수 있고

https://linecode.tistory.com/9

여기서는 조금 더 자세히 볼 수 있음.

결론부터 말하자면 코루틴은

코루틴(Coroutine)은 한 부분에서 실행을 중지하여 Unity에 제어권을 돌려주고, 계속할 때는 다음 프레임에서 중지한 곳부터 실행을 계속할 수 있는 기능이다.

뭐 이러건데

https://velog.io/@uchang903/UnityCoroutine%EC%BD%94%EB%A3%A8%ED%8B%B4%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%ED%99%9C%EC%9A%A9

여기 다시 정독 ㄱㄱ.


IEnumerator는 c++ iterator와 비슷? 하다고 보면 될거같은데

https://ecsimsw.tistory.com/entry/Iterators-IEnumerator-IEnumerable-yield#:~:text=IEnumerator%EC%9D%80%20Current%20%EC%86%8D%EC%84%B1%EA%B3%BC,%EC%9C%BC%EB%A1%9C%20%EC%98%AE%EA%B8%B0%EA%B1%B0%EB%82%98%20%EB%A6%AC%EC%85%8B%ED%95%9C%EB%8B%A4.

참고 ㄱㄱ.


막대기 옮기는 부분에서 Update 에서 매 프레임 마다 조건을 체크를 하여 이동을 시키면

'비효율'적이기 때문에

이렇게 코루틴을 통해서 이동을 시킬 것이다.

마치 Update에서 호출을 한것처럼

이렇게 호출을 하면은 MoveTo라는 코루틴이 실행되자마자

https://learnandcreate.tistory.com/688

여기 블로그 처럼 테스트를 해보면은

이쯤 시작해서

이쯤 멈춘다.

10.65쯤에 코루틴 시작하러 싱글 쓰레드가 들어왔다가

while문 안에서 percent < 1만족할 때까지 돈다.

아무튼 이런식으로 percent에따라 Vector3.Lerp사용하는 것도 배우고 나름 ㄱㅊ은듯?


profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글