인프런 커뮤니티 질문&답변

성연철님의 프로필 이미지
성연철

작성한 질문수

레트로의 유니티 C# 게임 프로그래밍 에센스

PlayerMovement (2/4)

if (CharacterController.isGrounded) currentVelocityY = 0f;

작성

·

364

0

static이 아닌 필드, 메서드 또는 속성 CharacterController.isGrounded

에 개체참조가 필요합니다. 라고 오류가 납니다 ㅠㅠ

답변 6

1

if (CharacterController.isGrounded) currentVelocityY = 0f;

가 아니라

if (characterController.isGrounded) currentVelocityY = 0f;

입니다. 대문자로 작성하셔서 그렇습니다. 

PlayerMovement.cs 에서 제일 위에 보면 멤버변수들을 선언하고 있어요.

private CharacterController characterController;

private PlayerInput playerInput;

private Animator animator;

이런 식으로요.

이제민 강사님께서 변수들의 자료형과 변수명들을 동일하게 쓰되 대문자 소문자만 바꿔 쓰셔서

헷갈리신 것 같습니다.

저같은 경우는 멤버변수를 선언할 경우는 다른 지역변수나 위와 같은 헷갈림을 방지하기 위해서 변수 선언시

앞에 m_ 를 사용하고(스몰엠 언더바 로 읽습니다) 뒤에 변수명이 길어질 경우는 조금 줄이는 편입니다.

(사실 멤버변수를 선언하는 방식 중 m_ 는 고전방식이고 요즘은 _언더바만 사용하도록 변해가는 추세라고 합니다)

이런 식으로 지을 수 있겠네요.

private CharacterController m_CharCtrl;

private PlayerInput m_PlayerInput;

private Animator m_Anim;

이런 식으로 지었을 경우, 위의 if문의 내용은

if (m_CharCtrl.isGrounded)

{

    currentVelocityY = 0.0f;

}

라고 쓸 수 있겠습니다.

일반적으로 모든 변수는 대문자가 아니라 소문자로 시작하는 것이 국룰인데

이에 대해서는 파스칼 표기법, 카멜 표기법 등으로 검색하시면 잘 알 수 있습니다.

1

정확히 어떤 코드인지는 알 수가 없으나

함수를 static 으로 선언하시면 항상 메모리에 로드되어 있기 때문에 오류가 안뜰겁니다.

static 으로 선언하지 않거나 해선 안되는 경우엔, 그냥 new 로 개체를 생성해주세요.

0

C# 프로그래밍 기본 마지막 강의인 오브젝트와 클래스? 를 다시 들어보세요.

마지막에 rb 변수를 선언하는데 그 rb가 멤버변수 입니다.

즉 public Rigidbody m_Rb; 라고 선언했겠네요.

멤버변수를 선언하는 이유는 제민님이 잘 알려주십니다. 말 그대로 컴포넌트들을 게임오브젝트에 갖다 붙이고

갖다 붙인 애들을 갖고 놀려고 멤버변수로 선언한 것들에 적용시켜서 코딩을 하고 갖고 놀겠다는 뉘앙스로 생각하시면 됩니다.

허나, 위의 PlayerMovement 스크립트의 경우 유니티 인스펙터 창에서 그런것들이 안보일겁니다.

(그런 것들이란, 멤버변수로 선언한 Animation, PlayerInput, characterController 등)

왜냐하면 public이 아니라 private 으로 선언했기 때문입니다.

+추가)

더 앞에 있는 선수 강의인

게임 엔진의 원리 : 게임 오브젝트와 컴포넌트로 다시 들어보세요.

여기서도 후반부에 똑같은걸 설명하시네요.

0

성연철님의 프로필 이미지
성연철
질문자

아 너무 감사합니다 ㅠㅠ 

대문자 소문자 하나에도 이렇게 바뀌는거 보면 너무 어렵긴 하네요ㅠㅠ..

개인시간 까지 할애해서 도와주셔서 너무 감사합니다 ㅠㅠ

0

성연철님의 프로필 이미지
성연철
질문자

어떤 개체를 선언해야 할까요? 영상에서 나온 그대로 따라가고 있는데 오류가 떠서 너무 난감하네요 ㅠㅠ 

    public void Move(Vector2 moveInput)

    {

        var targetSpeed = speed * moveInput.magnitude;

        var moveDierction = Vector3.Normalize(transform.forward * moveInput.y + transform.right * moveInput.x);

        var smoothTime = characterController.isGrounded ? speedSmoothTime : speedSmoothTime / airControlPercent;

        targetSpeed = Mathf.SmoothDamp(currentSpeed, targetSpeed, ref speedSmoothVelocity, smoothTime);

        currentVelocityY += Time.deltaTime * Physics.gravity.y;

        var velocity = moveDierction * targetSpeed + Vector3.up * currentVelocityY;

        characterController.Move(velocity * Time.deltaTime);

        if (CharacterController.isGrounded) currentVelocityY = 0f;

여기서 맨 아랫줄이 오류가 나고있습니다..

0

성연철님의 프로필 이미지
성연철
질문자

CharacterController.isGrounded

이 부분이 오류가 납니다.

성연철님의 프로필 이미지
성연철

작성한 질문수

질문하기