유니티 심화
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);
}
}