본문 바로가기

개발자_뉴비일지

내일배움캠프 Unity 45일차 TIL - START TeamProject04

string keyword="START TeamProject04";

1. Player

팀프로젝트가 어제부터 시작되었고 난 플레이어 부분을 맡았다.

크게 플레이어의 움직임, 회피, 원거리공격을 구현해야한다.

 

 

(1)Move

 

처음엔 character controller 컴포넌트로 간단하게 움직이게 만들었다.

 

<PlayerController>

public class PlayerController_1 : MonoBehaviour
{
    public CharacterController playerControl;
    public float speed;
    private float gravity;
    private Vector3 moveDiretion;


    // Start is called before the first frame update
    void Start()
    {
        speed = 5f;
        gravity = 10f;
        moveDiretion = Vector3.zero;
    }

    // Update is called once per frame
    void Update()
    {
        if (playerControl == null) return;
        if(playerControl.isGrounded)
        {
            moveDiretion = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            moveDiretion = playerControl.transform.TransformDirection(moveDiretion);
            moveDiretion *= speed; 
        }
        else
        {
            moveDiretion.y -= gravity * Time.deltaTime;
        }

        playerControl.Move(moveDiretion*Time.deltaTime);
    }
}

플레이어가 잘 움직여 지긴 했지만 character controller은 단점도 많고 제한사항도 많다.

그리고 아무래도 input system을 활용한 방법이 많이 쓰이기 때문에 지금이라도 빨리 갈아엎기로 했다.

 

>>input system으로 무빙에 관한 키들을 설정.

 

새로운 <PlayerController>

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Interactions;

public enum PlayerState
{
    None,
    Move,
    Dash,
}

public class PlayerController : MonoBehaviour
{
    public float moveSpeed = 5f;
    private Vector2 moveInput;
    private Vector3 moveDirection;

    public void Move()
    {
        if (moveDirection == Vector3.zero)
            return;
        transform.rotation = Quaternion.LookRotation(moveDirection);
        transform.position += (moveDirection * moveSpeed * Time.deltaTime);
    }

    public void OnMove(InputAction.CallbackContext context)
    {
        Debug.Log("작동");
        moveInput = context.ReadValue<Vector2>(); //입력받아서 움직임
        moveDirection = new Vector3(moveInput.x, 0f, moveInput.y); //방향설정
    }
}

>>Player Action에 넣어줄 OnMove함수를 만들고 Move에 동작을 넣어주었다.

vector2로 좌표를 받아 움직이며 vector3값으로 방향전환이 가능하다.

 

 

(2)Dash

 

플레이어가 보스의 공격을 회피할 수단.

다음 스크립트를 추가해줬다.

    private Vector3 dashDirection;
    public float dashTime;//대시지속시간
    public float DashCoolTime;//쿨타임
    public PlayerState playerState;
    public float dashSpeed;

    void Update()
    {
        switch (playerState)
        {
            case PlayerState.Move:
                Move();
                break;
            case PlayerState.Dash:
                Dash();
                break;
        }
    }
    
    public void Dash()
    {
        //DashCoolTime += Time.deltaTime;//시간이 누적됨
        transform.position += (dashDirection * dashSpeed * Time.deltaTime);//대시로 이동

        if(DashCoolTime > dashTime)//시간 지나면 Move상태로.
        {
            playerState = PlayerState.Move;
        }
    }

    public void OnDash(InputAction.CallbackContext context)
    {
        Debug.Log("대시");
        if (playerState == PlayerState.Dash)
        {
            return;
        }

        dashDirection = moveDirection;//moveDirection 방향으로
        playerState = PlayerState.Dash;

        if (DashCoolTime >= 2.2f)
        {
            DashCoolTime = 0; //초기화
        }
    }

0.2초동안 대시로 빠르게 이동이 가능하다.

무적 판정은 플레이어가 죽을때 발동되는 메서드 처음에 

 if (controller.playerState == PlayerState.Dash)
     return;

Dash상태일 때에는 바로 return되도록 추가해주었다.

그러면 플레이어가 죽지 않으니 무적인 셈이다!

 

다음은 쿨타임을 걸어줘야 하는데 새로 만들까 하다가 튜터님이 이미 만들어진 코드에 힌트가 있다고 하셔서 고민하며 뜯어봤다.

 if (DashCoolTime <= 2.2f)
 {
     DashCoolTime += Time.deltaTime;
 }

>>업데이트 부분에 추가를 해주어 쿨타임시간이 계속 가게 해주되 Dash를 쓰면 초기화가 가능하게 해두었다.

 

void Start()
{
    playerState = PlayerState.Move;
    DashCoolTime = 2.2f;
}

그리고 시작하자마자 2.2초를 주어서 처음1회는 Dash가 가능하도록 설정했다.

 

마무리

하루종일 무브랑 대시부분으로 고민고민했다ㅠㅠ

튜터님 도움을 많이 받아서 완성한 코드지만 계속 뜯어보고 보다보니 이해가 됐다!

내일은 플레이어가 칼을 던지고 받는 것을 구현해봐야겠다.

 

 

.

.

.

with 용이