Camera

jinsuk·2023년 9월 16일
0
post-thumbnail
  • 카메라 떨림현상 방지를 위해 Update문을 LateUpdate로 수정해준다.
  • 플레이어의 이동과 관련된 Update문 다음에 카메라 이동을 해주기위해서
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    [SerializeField]
    Define.CameraMode _mode = Define.CameraMode.QuarterView;

    [SerializeField]
    Vector3 _delta = new Vector3(0.0f, 6.0f, -5.0f);

    [SerializeField]
    GameObject _player = null;

    void Start()
    {
        
    }

    void LateUpdate()
    { 
        if (_mode == Define.CameraMode.QuarterView)
        {
            RaycastHit hit;
            if (Physics.Raycast(_player.transform.position, _delta, out hit, _delta.magnitude, LayerMask.GetMask("Wall")))
            {
                float dist = (hit.point - _player.transform.position).magnitude * 0.8f;
                transform.position = _player.transform.position + _delta.normalized * dist;
            }
            else
            {
				transform.position = _player.transform.position + _delta;
				transform.LookAt(_player.transform); // 카메라가 무조건 플레이어의 좌표를 주시하도록함
			}
		}
    }

    public void SetQuarterView(Vector3 delta)
    {
        _mode = Define.CameraMode.QuarterView;
        _delta = delta;
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [SerializeField]
    float _speed = 10.0f;

	bool _moveToDest = false;
	Vector3 _destPos;

    void Start()
    {
		Managers.Input.KeyAction -= OnKeyboard; 
		Managers.Input.KeyAction += OnKeyboard;  // InputManager한테 혹시라도 어떤 키가 눌리면 Onkeyeboard함수를 실행해주세요
		Managers.Input.MouseAction -= OnMouseClicked;
		Managers.Input.MouseAction += OnMouseClicked;
	}

    void Update()
    {
		if (_moveToDest)
		{
			Vector3 dir = _destPos - transform.position;
			if (dir.magnitude < 0.0001f) // 만약 도착했다면
			{
				_moveToDest = false;
			}
			else
			{
				float moveDist = Mathf.Clamp(_speed * Time.deltaTime, 0, dir.magnitude); // 캐릭터가 움직이는거리가 도착지까지 남은거리보다는 작아야 한다.
				// -> 도착지에 도착했을떄 부들거리는 현상 방지 
				transform.position += dir.normalized * moveDist;
				transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(dir), 20 * Time.deltaTime);
			}
		}
    }

    void OnKeyboard()
    {
		if (Input.GetKey(KeyCode.W))
		{
			transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), 0.2f);
			transform.position += Vector3.forward * Time.deltaTime * _speed;
		}

		if (Input.GetKey(KeyCode.S))
		{
			transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.back), 0.2f);
			transform.position += Vector3.back * Time.deltaTime * _speed;
		}

		if (Input.GetKey(KeyCode.A))
		{
			transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.left), 0.2f);
			transform.position += Vector3.left * Time.deltaTime * _speed;
		}

		if (Input.GetKey(KeyCode.D))
		{
			transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.right), 0.2f);
			transform.position += Vector3.right * Time.deltaTime * _speed;
		}

		_moveToDest = false;
	}

	void OnMouseClicked(Define.MouseEvent evt)
	{
		if (evt != Define.MouseEvent.Click)
			return;


		Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
		Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f);

		RaycastHit hit;
		if (Physics.Raycast(ray, out hit, 100.0f, LayerMask.GetMask("Wall")))
		{
			_destPos = hit.point;
			_moveToDest = true;
		}
	}
}
profile
공부기록용

0개의 댓글

Powered by GraphCDN, the GraphQL CDN