본문 바로가기

3D_FPS

08-02 (3D_FPS) CamRotate.cs, PlayerMove.cs 생성

CamRotate, PlayerMove, RigidBody, CharacterController에 관한 설명

더보기
서론

지금 부터는 이제 글 쓰기가 아니라, 

 

이제는 생각이라는걸 하게 될거임. 그리고 설계를 하고 어떻게 잘 짠 코드를 만들까.

이런 생각들을 하게 될 거임.

 

그리고 생각보다 컨텐츠 수준이 떨어 질 수도 있음.

 

그리고 잘 짠코드라는게 어떤 글쓰기인지 보여주고 수준을 높일 거임.

지금까지는 그냥 생각의 나열임. 핵심이 있는게 아니라.하고싶은걸 던져놓는 글쓰기

 

--------------------

아빠가 혼냈다

미웠다. 같이 안자야지

근데 아이스크림 사주셨다.

그래서 같이 자기로 했다. 정도?

--------------------

 

이번달은 글쓰기의 체계화임!!

체계화 된 글 쓰기 [책의 모습]

 

 

 

 

(참고) 리듬게임 제작

 

 

 

1. 사운드 넣고

 

curTime += Time.deltaTime; 해놓고

그때마다 Space바 를 눌러서 

다 딴다

 

파일을 Text 에 저장 하는 법.

 


3D FPS 제작

 

Quad 로 바닥 생성, 플레이어 생성

Quad 와 플레이어를 생성한 모습

 

그리고 플레이어의 눈을 생성해주기 위해 카메라를 플레이어의 눈 쪽에 놔둔다.

플레이어의 눈을 만든다.

 


(참고) 최적화

속도의 최적화 => 어떻게 하면 안그릴까를 생각하는것임!

Quad 의 뒷면이 안보이는걸 Curling  이라고함

 

Back Face Curling 이라고 함!

이걸 반대로 하는 방법:

 

  • Back Face Curling  이걸 끄던가
  • normal 에 -1 을 곱해져서

 


SkyBox 

 

Image 뒤에는 Map 을 씀

'이미지맵' 같이

 

SkyBox 는 환경맵인데, 

cube 맵이라고도 함

 

게임상에는 엄청 큰 큐브 안에 우리가 있는거임!

 

 

그래서 SkyBox 를 정육면체로 보느냐, HDRI(반구형태) 로 보느냐에 따라 다름

 


 

CamRotate.cs 생성

 

v 는 왜 -를 붙여야 할까?

 

Render PipeLine 그 과정에서

 

Render PipeLine 과정

 

여기서 월드좌표계는 위로갈 수록 값이 커지는데

 

Screen 좌표에서는 아래로 갈수록 Y값이 커짐!!


 

여기서 근데 위로 90도 아래로 90도 까지만 각을 올렸다 내릴 수 있음.  왜 그럴까?

 

Euler 값을 print를 해보면 알 수 있음!!

 

EulerAngle 은 - 값이 들어오면 360도를 더해버림.

코드와, EulerAngle 을 설명하는 화면

 

transform.eulerAngles += dir * rotSpeed * Time.deltaTime;

이렇게 쓰면 eulerAngle 한테 모든걸 맡기는 거임

그러면 아까같은 우리가 원치도 않는 각도 제어가 나오게 된다.

 

그러니까, EulerAngle 을 직접 우리가 관리 해보자

 

 

 

 

각도를 관리하기 위해 생성

 

직접 설정해주기 위해 만든 부분

 

우리가 직접만들어버리면 360 더하든 뭐하든 상관 없어짐!!

 

근데 너무 빙글빙글 도니까 , 각도를 조절 해보자!

 

각도 조절을 위해 Mathf.Clamp 를 사용한 모습

 

 


근데 내가 처음에 이렇게 아래를 보게 시작하고싶은데, 플레이하면 그냥 다 바뀌어버림

 

아까 설정한 값들

이 값들의 초기값이 0 이기 때문에 카메라.rotation 이 (0,0,0) 으로 바뀐다.

이렇게 보고싶은데 시작하면 초기값이라서 0,0 이라 초기화됨!

 

그러면 mx, my 에 처음 설정해준 값이 들어가있으면 보는 화면상태로 실행 될 것이다!

 

시작값을 넣어 준 모습


참고

여기서 CamRotate 를 (Object)Cube 에 붙여보면,움직일거임 =>

캐릭터를 만들때, 손으로 캐릭터를 옆으로 돌리면 돌아가는 그 느낌으로 만들 수 있음,

아디다스 매장에서 키오스크같은곳에서 신발 디자인 되어있으면 손으로 돌려보면서 확인하는 것 처럼


 

큐브의 모서리를 기준으로 회전하는법

큐브를 회전시키면 큐브의 중심이 큐브 안에 있기 때문에 모서리를 기준으로 회전할 수 없다

 

하지만, 신기한 방법 하나가 있다

현재는 큐브의 중심이 큐브 안에 있는것을 확인 할 수 있다

빈 GameObject 를 만들어서 큐브의 부모로 놓고

 

pivot 선택해서 부모 위치를 모서리로 옮겨줄려고 하는 모습

 

pivot 을 선택해서 부모 GameObject 를 모서리로 옮겨주면 됨!

 


RigidBody

RigidBody 를 사용하면 플레이어가 Cube 에 

유니티에서 제공하는 물리로는 제대로된 물리를 표현할 수 없음

 

멋진효과나 이런것들은, RigidBody 를 이용하면 수정을 할 수가 없음

 

그래서 Character Controller 를 자주 사용함!

 


PlayerMove.cs 생성

2D Shooting 에서 한 것처럼 키보드로 움직일 수 있는 Player Script 를 생성한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    // 사용자의 입력에 따라 앞뒤좌우 이동하고 싶다.
    //필요속성 : 이동속도


    //필요속성 ; 이동속도
    public float speed = 5;

    CharacterController cc;

    // Start is called before the first frame update
    void Start()
    {
        cc = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        // 사용자의 입력에 따라 앞뒤좌우 이동하고 싶다.
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        Vector3 dir = new Vector3(h, 0, v);

        // P = P0 +vt
        cc.Move(dir * speed * Time.deltaTime);


    }

}
CharacterController의 메서드 "Move"

 

여기서 cc.Move 에 있는 Move 는 Character Controller 에 있는 메소드 Move 를 사용 한 것이다.

 

이 Move 는 움직이기 전 충돌을 감지 하는 역할을 한다.