본문 바로가기
GGM/엔진

20230308 - 엔진 - 플레이어 움직이게, 쉐이더

by DDongYeop 2023. 3. 8.
728x90

 

움직일 속도를 넣어둘 변수와, rigidbody를 사용 안 하기 때문에 중력의 속도를 넣을 변수를 만들어주고,

CharaterController을 넣어둘 변수, 그리고 움직임을 직접적으로 담당할 변수 _movementVelocity를 만들고, 

평면 속도를 담아둘 MovementVelocity와, 중력 속도를 담을 _verticalVelocity변수를 만들어준다. 

    [SerializeField] private float _moveSpeed = 8f, _gravity = -9.8f;

    private CharacterController _characterController;

    private Vector3 _movementVelocity;
    
    public Vector3 MovementVelocity => _movementVelocity; 
    private float _verticalVelocity; 

    private void Awake()
    {
        _characterController = GetComponent<CharacterController>();
    }

 

 

 

이후 플레이어에게 입력을 받아 _moveVelocity에 넣어준다. 

private void Update()
{
    UpdateMovement();
}

private void UpdateMovement()
{
    float horizontal = Input.GetAxisRaw("Horizontal");
    float vertical = Input.GetAxisRaw("Vertical");

    _movementVelocity = new Vector3(horizontal, 0, vertical);
}

 

 

 

이후 _movementVelocity을 Normalize를 시켜주고, 지정해둔 스피드로 갈 수 있도록 Time.fixedDeltaTime을 곱해준다.

그후 우리의 게임은 현제 쿼터뷰이기 때문에 쿼터뷰에 맞춰 w를 누르면 위로 갈 수 있도록 플레이어를 (0, -45,0)만큼 돌려준다. 

이후 게임오브젝트에 _movementVelocity을 적용시킨다. 

private void CalculatePlayerMovement()
{
    _movementVelocity.Normalize(); 
    
    _movementVelocity *= _moveSpeed * Time.fixedDeltaTime;
    _movementVelocity = Quaternion.Euler(0, -45f, 0) * _movementVelocity;
    if (_movementVelocity.sqrMagnitude > 0)
        transform.rotation = Quaternion.LookRotation(_movementVelocity);
}

 

Normalize를 아래처럼 사용 할 수도 있겠지만 메모리 관련된 문제로 이렇게 하는건 좋지 않다. 

스택메모리와 힙메모리의 차이를 알아두면 될것이다. 

_movementVelocity = _movementVelocity.normalized;

 

 

이후 FixedUpdate에서 아까 만들어둔 CaluatePlayerMovement를 실행시켜주고

땅에 있을때는 그냥 중력을 받고, 땅을 벗어났을땐 0.3이라는 가중치를 받게해서 계산을한다. 

이후 모든걸 계산하여 CharacterController에 적용시켜준다. 

    private void FixedUpdate()
    {
        CalculatePlayerMovement();  

        if (_characterController.isGrounded == false)
            _verticalVelocity = _gravity * Time.fixedDeltaTime;
        else 
            _verticalVelocity = _gravity * 0.3f * Time.fixedDeltaTime;

        Vector3 move = _movementVelocity + _verticalVelocity * Vector3.up;
        _characterController.Move(move);
    }

 

 

 

이후 구름이 땅에 반사되어 보기게 하는 쉐이더를 만들어주었다. 

 

 

우선 쉐이더의 변수를 먼저 설정해주고, 

 

시간과 이전에 생성했던 변수 TimeMultiplier을 곱해주고, 

지금 Position을 Split으로 R값과 B값만 추출하여 Vector2 노드에 넣어준다. 

 

이후 아까 만들어둔 두 값을 Tiling And Offset을 사용하여 Vector2값으로 바꿔주고,

Simple Noise노드에 NoiseScale변수와 함께 넣어서 노이즈를 추가해주고, Contrast에 ContrastValue변수와 함께 넣어서 대비를 높여준다. 

아래에선 아까 만들어둔 UV값을 Vector2값으로 반환하고, LargeNoiseScale과 함께 Simple Noise에 넣어서 노이즈를 만들어주고, Blend를 사용하여 두개를 섞어준다. 

 

 

이후 Clamp을걸고, Color변수와 Lerp를 걸고 출력하고, 

아까 만들어둔 것은 바로 Noise로 사용한다. 

 

 

MainTex와 AO로 샘플 텍스트를 만들고  AO로 만들어둔건 Ambient Oculusion에 넣어주고, MainTex와 AO는 서로 곱하고, 이후 아까 만든 CloudShader을 사용하여 적용시키고 나온 두 값을 곱하여 Base Color에 넣어준다.

이후 Matalic변와 Smoothness 변수는 잘 맞게 넣어주고, .Normal변수는 Sample Texture 2D를 사용하여 RGBA값으로 출력을 해주고 Normal값에 넣어주었다. 

 

 

이후 메테리얼을 만들고 적용하면 이런 결과가 나온다. 

 

 

이후 새로운 쉐이더 그래프를 만들고.

Position값을 Split하여 G값만 빼내고 Clamp을 한 후 ColorA와 ColorB로 Lerp을 해준 후 Base Color에 넣어준다. 

 

 

그후 메테리얼을 만들고 적용해보면 이렇게 y값에 맞춰 색이 변하는 것을 볼 수 있다. 

 

이후 또 쉐이더를 적고 

 

계단에도 적용시켜주었다. 

728x90

댓글