์์ฑ์๋์ด ์ํ์ ๊ฒ ์ด๋ฐ ๋ฐฉํฅ๊ฐ์๋ฐ์
๋ชจ์ ์ด๋ 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; } } |
๋ง์ ๋ค ์ฐ๊ณ ๋ณด๋๊น ์ฝ๊ฒ ๊ตฌํํ๋ คํ๋ค๋ฉด D๋๋ ์๋ 90๋, W๋๋ ์๋ 0๋, WD ๋๋ ์๋ 45๋ ๋ฑ๋ฑ ๋ค if๋ฌธ ๋ฐ๋ณตํด์ ๋ฐ์์จ๋ค์ ์นด๋ฉ๋ผ์ y๋กํ ์ด์ ๋ฐ์์์ ํ๋ ์ด์ด์ y๋กํ ์ด์ ์ ์นด๋ฉ๋ผ y๋กํ ์ด์ + ๋ฐ์์จ ๊ฐ๋ ํด์ฃผ๋ฉด ๋์ด๋ค์ ์ผ์ผ์ด ๋ฒกํฐ์ ๊ฐ๋๋ก ํ์ด์ฐ๋ ค๋๊น ์คํ๋ ค ๊ดด์ํ๊ฒ ๋๋ฏ..
๊ตฟ~