• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

미로 준비 - 플레이어 생성에서 2가지 질문이 있습니다.

22.05.06 01:51 작성 조회수 84

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
안녕하세요. 강사님
강의 잘 보고 있습니다!
 
실습하면서 궁금한 점이 2가지 생겼는데요,
그동안 배운 것을 응용해보고자 플레이어 좌표를 멤버 변수로 public int x와 public int y가 아닌,
구조체와 프로퍼티를 응용해서 아래와 같이 만들었습니다.
그런데 구조체 프로퍼티를 이렇게 만들면 프로퍼티를 통한 set을 할 수가 없더군요...
어지쩌지 구글링을 해보니 구조체가 값 타입이어서 set을 하는 의미가 없다는 내용으로 이해했습니다.
 
그래서 아래와 같이 변형해서 사용을 했습니다.
근데 이렇게 사용하면 은닉성이 의미가 없는 것 같아서;;
1. 구조체의 경우 프로퍼티를 어떻게 사용하면 될까요?
 
다음 질문은 deltaTick 관련 질문입니다.
FPS region 안에서 dletaTick 연산 방법이 currentTick - lastTick을 하는 위 조건문과 동일하길래
아래(기존 코드)
에서 아래(수정 코드)
2. 위와 같이 코드를 변경해서 사용해도 겉보기엔 문제가 없어보이는데, 이게 조금이나마 더 근접한 deltaTick으로 계산되지 않을까요?
 
2-1. 위 코드(기존 코드)는 WAIT_TICK의 값이 크면 클 수록 deltaTick을 연산하는 주기도 줄어들기 때문에 조금씩 오차가 생기는 로직으로 이해했는데, 제대로 이해했나요?
 
물론 WAIT_TICK 값이 드라마틱하게 크지 않는 이상 큰 차이를 느끼진 못하겠지만, 로직이 조금 해깔려서 이해하고 싶은 취지에서 질문드립니다!

답변 1

답변을 작성해보세요.

0

1.
예상하신대로 C#의 struct는 get; set랑 친하지가 않습니다.
기본적으로 C#에서 struct는 복사형인데,
get으로 갖고 온 다음에, 복사본에 뭘 설정해도
[어차피] 복사본에 적용되기 때문에 의미가 없기 때문이죠.
위 예제에서도 position을 한 방에 세팅해야지,
세부적으로 position.x = 10;을 한다고 해도 의미가 없는 것과 유사합니다.
실제로 유니티 작업을 하다보면 Vector3도 유사하게 z만 바꾸고 싶어도
new Vector3(x, y, z)으로 통으로 설정하곤 합니다.
그게 정말 싫다면 class로 만들건 int로 더 세분화해서
만드는 등 다양하게 우회하면 됩니다.

2.
코드 수정은 자유롭게 해보시기 바랍니다.
언제 그렇지만 프로그래밍에는 정답이 없게 늘 의심하는 습관이 필요합니다.
프레임 계산은 정확할 수가 없기에 근사값으로 처리해주면 됩니다.
실제로 롤 같은 게임을 해도 200FPS가 정확히 고정이 아니라
195~210 사이로 조금씩 왔다 갔다 하는 것과 유사합니다.

참고로 코드에 버그가 있는데
int currentTick = Environment.TickCount & Int32.MaxValue;
로 수정이 필요합니다.
(TickCount가 C#에서는 C++와 다르게 동작해서 제가 혼동했네요)
https://www.inflearn.com/questions/78754

imdev님의 프로필

imdev

질문자

2022.05.06

명쾌한 답변 감사합니다 강사님!

쏙쏙 이해됬어요.

 

2번 내용도 재밌어요 ㅎㅎㅎ

왜 Int32.MaxValue를 논리곱하는지 조금 의하했는데,

범위가 더 적은 sbyte로 이것저것 값을 만지다보니,, maxValue의 부호비트는 0이기에,

항상 양수가 나올 수 밖에 없네요...

 

답변 감사합니다.