7fed8274a8826beb3eec9be4439c766b2c3f61cb743fad2de85e067311a00e7685985f4f


์ž‘์„ฑ์ž๋‹˜์ด ์›ํ•˜์‹ ๊ฒŒ ์ด๋Ÿฐ ๋ฐฉํ–ฅ๊ฐ™์€๋ฐ์š”

๋ชจ์…˜์ด๋‚˜ lerp๊ฐ™์€ ์„ธ์„ธํ•œ๊ฑด ๋‹น์—ฐํžˆ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค

์ผ๋‹จ ์›์‹ฌ๋ ฅ์ฒ˜๋Ÿผ ์›€์ง์ด๋Š” ๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค

1. ํ”Œ๋ ˆ์ด์–ด๋Š” ์นด๋ฉ”๋ผ๊ฐ€ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ํŠน์ • ๊ฐ๋„๋กœ ์ด๋™ํ•จ. Dํ‚ค๋ฅผ ๋ˆ„๋ฅธ๊ฒฝ์šฐ ์นด๋ฉ”๋ผ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์—์„œ ์œ ๋‹ˆํ‹ฐ ์ขŒํ‘œ๊ณ„๋กœ 90๋„ ํšŒ์ „ํ•œ ๊ฐ๋„

2. ๊ทธ๋Ÿผ ๊ทธ ์ด๋™ํ•œ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์นด๋ฉ”๋ผ๋ฅผ ๋Œ๋ ค์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋Œ์•„๊ฐ„ ๋ฐฉํ–ฅ๋ฒกํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ”Œ๋ ˆ์ด์–ด์™€ ์ผ์ •๊ฑฐ๋ฆฌ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

3. ๊ทธ๋Ÿผ ๊ฐ๋„๊ฐ€ ๋ฐ”๋€Œ์—ˆ์œผ๋‹ˆ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋‹ค์Œ์— ์›€์ง์ด๋Š” ๊ฐ๋„๋„ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ์ฒซํ”„๋ ˆ์ž„์— ์นด๋ฉ”๋ผ๊ฐ€ 0๋„๋ผ๋ฉด ํ”Œ๋ ˆ์ด์–ด๋Š” 90๋„ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ผํ…๋ฐ

ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์›€์ง์ธ ํ›„ ์นด๋ฉ”๋ผ๊ฐ€ 1๋„ ํšŒ์ „ํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ ํ”„๋ ˆ์ž„์— ํ”Œ๋ ˆ์ด์–ด๋Š” 91๋„ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ผ ๊ฒ๋‹ˆ๋‹ค.


๋˜‘๊ฐ™์€ ์›๋ฆฌ๊ฐ€ ์‘์šฉ๋˜๋ฉด ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ญ‰ ์ด๋™ํ–ˆ์„๋•Œ 0๋„์™€ 180๋„๋ฅผ ์ œ์™ธํ•˜๋ฉด ๋ชจ๋“  ๊ฐ๋„์—์„œ ๋ฌด์กฐ๊ฑด ์›์„ ๊ทธ๋ฆด ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค

๊ทธ๋ž˜์„œ 45๋„ ๋ฐฉํ–ฅ์ธ WD๋ฅผ ๋ˆ„๋ฅธ๋‹ค๋ฉด ํฐ ์›์„ ๊ทธ๋ฆฌ๊ฒ ์ฃ 

์ˆ˜ํ•™์ ์œผ๋กœ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜๋ ค๋‹ค๊ฐ€ ๋” ์ฝ”๋“œ๊ฐ€ ์–ด๋ ค์›Œ์ง„ ๊ฒƒ ๊ฐ™๊ธฐ๋„ ํ•œ๋ฐ ์ผ๋‹จ ์ฝ”๋“œ ์ „๋ฌธ์ž…๋‹ˆ๋‹ค



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerTemp : MonoBehaviour
{
Camera _camera;
// ์ž…๋ ฅ ๊ฐ’, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์บ๋ฆญํ„ฐ๋ฅผ ํšŒ์ „ ์‹œํ‚ฌ ๊ฐ๋„๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค
// ๊ทธ๋ƒฅ if ๋ฌธ์œผ๋กœ ๊ฐ๋„๋งŒ ๋ฐ›์•„๋„ ๋˜๋Š”๋ฐ if ์ค‘๋ณต ์—†์ด ๋ฒกํ„ฐ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฑธ ๊ฐœ์ธ์ ์œผ๋กœ ์„ ํ˜ธํ•ด์„œ
Vector2 _direction = Vector2.zero;
void Start()
{
_camera = Camera.main;
}
void Update()
{
Move();
}
void Move()
{
_direction = Vector2.zero;
// ์•ž์œผ๋กœ ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ํšŒ์ „ ๊ฐ 0๋„
if (Input.GetKey(KeyCode.W))
{
// ํ•ด๋‹น ๊ฐ์— ํ•ด๋‹นํ•˜๋Š” ๋ฒกํ„ฐ๋ฅผ ๋”ํ•ด์ค€๋‹ค ๋Œ€์ž…์ด ์•„๋‹ˆ๋ผ
// ์“ธ๋ฐ์—†์ด ์ฝ”์‚ฌ์ธ ์‚ฌ์ธ ์“ด ์ด์œ ๋Š” ๊ฐ๋„๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ
_direction += new Vector2(Mathf.Cos(0 * Mathf.Deg2Rad), Mathf.Sin(0 * Mathf.Deg2Rad));
}
// ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ํšŒ์ „ ๊ฐ -90๋„
if (Input.GetKey(KeyCode.A))
{
_direction += new Vector2(Mathf.Cos(-90 * Mathf.Deg2Rad), Mathf.Sin(-90 * Mathf.Deg2Rad));
}
// ๋’ค๋กœ ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ํšŒ์ „ ๊ฐ 180๋„
if (Input.GetKey(KeyCode.S))
{
_direction += new Vector2(Mathf.Cos(180 * Mathf.Deg2Rad), Mathf.Sin(180 * Mathf.Deg2Rad));
}
// ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ํšŒ์ „ ๊ฐ 90๋„ ๊ทธ ์ผ๋ฐ˜์ ์ธ ์œ ํด๋ฆฌ๋“œ ์ขŒํ‘œ๊ณ„์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ๊ธฐ๋•Œ๋ฌธ์— ๋ฐ˜๋Œ€๋กœ ํ•ด์คŒ
if (Input.GetKey(KeyCode.D))
{
_direction += new Vector2(Mathf.Cos(90 * Mathf.Deg2Rad), Mathf.Sin(90 * Mathf.Deg2Rad));
}
// ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์€ ํ›„ ๋ฐฉํ–ฅ๋ฒกํ„ฐ ์ •๊ทœํ™” ์ด๋Ÿฌ๋ฉด ๊ฐ๋„๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‚˜์˜จ๋‹ค
_direction.Normalize();
// ์ž…๋ ฅ๊ฐ’ ๊ฒฐ๊ณผ๊ฐ€ ad, ws๊ฐ™์€ ์„œ๋กœ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ์˜ ํ•ฉ์ด๋ฉด 0์ด๋‹ˆ๊นŒ ์ด๋™ํ•  ํ•„์š”์—†์Œ
if (_direction == Vector2.zero)
return;
// 0๋„ ๋ฒกํ„ฐ์™€(์‚ฌ์‹ค์ƒ Vector2.right) _direction๊ฐ„์˜ ๊ฐ๋„ ๋ฐ›์•„์˜ด if๋ฌธ ์ค‘๋ณต์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ƒฅ 45๋„ 90๋„ 180๋„ 135๋„.. ๋ฐ”๋กœ ๋ฐ›์•„์˜ค๋ฉด ๋จ
float angle = Vector2.SignedAngle(new Vector2(Mathf.Cos(0 * Mathf.Deg2Rad), Mathf.Sin(0 * Mathf.Deg2Rad)), _direction);
// ์นด๋ฉ”๋ผ๊ฐ€ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋ฒกํ„ฐ ์–ป์–ด๋ƒ„
Vector3 moveDirection = _camera.gameObject.GetComponent<CameraTemp>().cameraDirection;
// y ๋ฐฉํ–ฅ ๋ฒกํ„ฐ๋Š” ์ œ๊ฑฐํ•ด์คŒ
moveDirection.y = 0.0f;
// ๋ฒกํ„ฐ ๋…ธ๋ง๋ผ์ด์ฆˆ ํ•ด์ฃผ๊ณ  ์นด๋ฉ”๋ผ๊ฐ€ 0, 0, 1 ๋ฒกํ„ฐ์— ๋Œ€ํ•ด ๋ช‡๋„ ๋Œ์•„๊ฐ€ ์žˆ๋Š”์ง€ ์ฒดํฌ ๊ทผ๋ฐ ์ด๋Ÿดํ•„์š”์—†์ด ๊ทธ๋ƒฅ ์นด๋ฉ”๋ผ ๋กœํ…Œ์ด์…˜ y๋ฐ›์•„์™€๋„ ๋ ๋“ฏ
moveDirection.Normalize();
float cameraAngle = Vector3.SignedAngle(Vector3.forward, moveDirection, Vector3.up);
// ํ”Œ๋ ˆ์ด์–ด์˜ ๋กœํ…Œ์ด์…˜์„ ์นด๋ฉ”๋ผ๊ฐ€ ๋Œ์•„๊ฐ€์žˆ๋Š” ๊ฐ๋„์— ์ž…๋ ฅ๊ฐ’ ๊ฐ๋„๋งŒํผ ๋”ํ•ด์„œ ๋Œ๋ ค์คŒ
transform.rotation = Quaternion.Euler(Vector3.up * (cameraAngle + angle));
// ๋ณด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฑธ์–ด๊ฐ
transform.Translate(Vector3.forward * Time.deltaTime * 10.0f);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraTemp : MonoBehaviour
{
public GameObject _player = null;
public float fdelta = -5.0f;
public Vector3 cameraDirection = Vector3.zero;
void Start()
{
}
void Update()
{
}
private void LateUpdate()
{
// LateUpdate์ด๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋ ˆ์ด์–ด ์œ„์น˜๋Š” ์ด๋™ํ–ˆ์ง€๋งŒ ์•„์ง ์นด๋ฉ”๋ผ๋Š” ์ด๋™ํ•˜์ง€ ์•Š์Œ
// ์ด๋™ํ•œ ํ”Œ๋ ˆ์ด์–ด ์œ„์น˜๋ฅผ ๋ฐ”๋ผ๋ด„
transform.LookAt(_player.transform);
// ๋‹ค์Œ ํ”„๋ ˆ์ž„์— ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ฐ›์•„๊ฐˆ ๋””๋ ‰์…˜ ์ €์žฅ
cameraDirection = _player.transform.position - transform.position;
cameraDirection.Normalize();
// ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ ์žˆ๋Š” ๊ทธ ๋ฐฉํ–ฅ๋Œ€๋กœ ๋’ค๋กœ ๋ฌผ๋Ÿฌ๋‚จ
transform.position = _player.transform.position + fdelta*cameraDirection;
// y๊ฐ’์˜ ์œ„์น˜๋Š” ํ”Œ๋ ˆ์ด์–ด์˜ ์ผ์ • ์‹œ์  ์œ„๋กœ ๊ณ ์ • ์‹œํ‚ด
Vector3 v = transform.position;
v.y = _player.transform.position.y + 5.0f;
transform.position = v;
}
}

cs