EasyCastleUNITY

Space Shooter 카메라 Player Follow 본문

유니티 심화

Space Shooter 카메라 Player Follow

EasyCastleT 2023. 8. 18. 11:54

절대강좌 유니티 책을 기반으로 작성함

FollowCam

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

public class FollowCam : MonoBehaviour
{
    //따라가야 할 대상을 연결할 변수
    [SerializeField]
    private Transform targetTransform;

    //따라갈 대상으로부터 떨어질 거리
    [Range(2.0f, 20.0f)] 
    [SerializeField]
    private float distance = 10.0f; //실제 수치가 제한 된것이 아니라 인스펙터 상에서의 제한

    public float Distance
    {
        get { return distance; }
    }

    //y축으로 이동할 높이
    [Range(0.0f, 10.0f)]
    [SerializeField]
    private float height = 2.0f;

    public float Height
    {
        get { return height; }
    }

    [SerializeField]
    private float damping = 10.0f; //반응속도 
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update메서드 이후의 실행
    void LateUpdate()
    {
        //카메라 위치, 언제나 플레이어 뒤에서 distance 만큼 떨어지고, 그 위치에서 height 만큼의 높이의 위치한다 
        Vector3 pos = this.targetTransform.position + (-this.targetTransform.forward * distance) + (Vector3.up * height);
        //구면 선형 보간 메서드를 이용, 부드럽게 위치를 변경
        this.transform.position = Vector3.Slerp(this.transform.position, pos, Time.deltaTime * damping); //(시작위치, 목표 위치, 시간 t)
        //카메라를 타겟에 피봇 좌표를 향하도록 함
        this.transform.LookAt(targetTransform.position);
    }
   
}

PlayerController

using System;
using UnityEngine;
using static PlayerControl;

public class PlayerController : MonoBehaviour
{
    [SerializeField]
    private float moveSpeed = 2.0f;
    [SerializeField]
    private float turnSpeed = 80f;

    private FollowCam followCam;
    private float distance;
    private float height;

    private void Awake()
    {
        this.followCam = GameObject.FindAnyObjectByType<FollowCam>();
    }

    private void Update()
    {
        this.distance = this.followCam.Distance;
        this.height = this.followCam.Height;    
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        float r = Input.GetAxis("Mouse X"); //왼쪽으로 마우스 움직이면, -, 오른쪽으로 마우스 움직이면 + 
        Vector3 moveDir = (Vector3.forward * v) + (Vector3.right * h);
        //Debug.Log(moveDir); 
        DrawArrow.ForDebug(this.transform.position, moveDir.normalized, 0f,Color.red);
        this.transform.Translate(moveDir.normalized * this.moveSpeed * Time.deltaTime);
        //마우스 왼쪽으로 움직이면, 왼쪽으로 회전, 마우스 오른쪽으로 움직이면, 오른쪽으로 회전
        Vector3 angle = Vector3.up * turnSpeed * Time.deltaTime * r;
        //this.transform.Rotate(angle); //set이 아니라 원래 rotation에서 더하는 방식으로 됨
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.white;
        GizmosExtensions.DrawWireArc(this.transform.position, this.transform.forward, 360, 1);
        DrawArrow.ForDebug(this.transform.position,this.transform.forward,0f,Color.green); //플레이어 앞에 길이 1의 화살표 그림
        DrawArrow.ForDebug(this.transform.position, -1 * this.transform.forward * distance, 0f, Color.yellow); //플레이어 뒤에 길이 3의 화살표 그림 
        Vector3 pos = this.transform.position + (-1 * this.transform.forward *distance);
        DrawArrow.ForDebug(pos, Vector3.up * height, 0f, Color.green);

 
    }

}