Publish:

νƒœκ·Έ: , ,

μΉ΄ν…Œκ³ λ¦¬:

πŸ“Œ Joystick

λͺ¨λ°”일 κ²Œμž„μ€ λŒ€λΆ€λΆ„ μ‘°μ΄μŠ€ν‹±μ„ μ΄μš©ν•΄ 캐릭터λ₯Ό μ΄λ™μ‹œν‚¨λ‹€.

κ°„λ‹¨ν•œ μ‘°μ΄μŠ€ν‹± 에셋을 μ΄μš©ν•΄ 이λ₯Ό κ΅¬ν˜„ν•΄λ³΄μž.

πŸ“ Asset

Nice Touch λΌλŠ” μœ λ£Œμ—μ…‹μ„ μ‚¬μš©ν–ˆλ‹€.

Unity Live λ₯Ό 보고 곡짜둜 λ°›μ•˜λ˜ 에셋이라 μ‚¬μš©ν•΄λ³΄μ•˜λ‹€.

nicetouch

πŸ“ 원리

Top View κ²Œμž„μ—μ„œ μ‘°μ΄μŠ€ν‹±μ€ νšŒμ „κ³Ό μ›€μ§μž„μ„ λ‹΄λ‹Ήν•œλ‹€.

ν˜„μž¬ 이 에셋에 μ‘΄μž¬ν•˜λŠ” μ‘°μ΄μŠ€ν‹±μ—λŠ” MMTouchJoystick ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•œλ‹€.

1
2
3
4
public class MMTouchJoystick
{
  public Vector2 _joystickValue;
}

이 ν΄λž˜μŠ€μ—λŠ” JoystickValue λΌλŠ” Vector2 κ°€ μ‘΄μž¬ν•˜λ©°

μ΄λŠ” Joystick 이 움직일 λ•Œ μ‹€μ‹œκ°„μœΌλ‘œ λ³€ν•˜λŠ” 값이닀.

ν•΄λ‹Ή 값을 ν† λŒ€λ‘œ κ°€κ³ μž ν•˜λŠ” λ°©ν–₯을 바라봄과 λ™μ‹œμ— 움직인닀.

이 κ²Œμž„μ˜ μΊλ¦­ν„°μ—λŠ” Rigidbody κ°€ λ‹¬λ €μžˆκΈ°μ— μ›€μ§μž„μ€ Rigidbody 둜, νšŒμ „μ€ eulerAngles 을 톡해 κ΅¬ν˜„ν•΄λ³΄μž.

πŸ“‹ Code

PlayerController

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
private float _horizontal;
private float _vertical;
private float _angle;

// μˆ˜ν‰, 수직, 각도 λ³€μˆ˜ μ±„μ›Œμ£ΌκΈ°
public void Movement(Vector2 move)
{
  _horizontal = move.x;
  _vertical = move.y;
  // ν˜„μž¬ μ‘°μ΄μŠ€ν‹±μ˜ 각도 (μ•ž : 0 , 쒌 : -90 , λ’€ : -180 , 우 : 90)
  _angle = Mathf.Atan2(_horizontal, _vertical) * Mathf.Rad2Deg;
	if(_angle < 0)
  {
    _angle += 360;
  }
}

// Movement λ©”μ†Œλ“œλ₯Ό 톡해 μ‘°μ΄μŠ€ν‹±μ—μ„œ 받은 값을 ν† λŒ€λ‘œ _angle μˆ˜μ •
private void Update()
{
  // Photon 을 톡해 λ‚΄ μΊλ¦­ν„°λ§Œ μ›€μ§μ΄κ²Œ λ§Œλ“€κΈ°
  if(_pv.IsMine)
  {
    if(_joyStick._joystickValue != Vector2.zero) {
      Movement(_joyStick._joystickValue);
    } else {
			Movement(Vector2.zero);
		}
  }
}

// μ›€μ§μž„
private void FixedUpdate()
{
  if(_pv.IsMine)
  {
    Vector3 movement = new Vector3(_horizontal, 0, _vertical) * _walkSpeed * Time.fixedDeltaTime;
		
    // νšŒμ „μ‹œμΌœμ£ΌκΈ°
    if(_angle != 0)
    {
      float cur = this.transform.eulerAngles.y;
      float tar = _angle;
      float yrot = Mathf.Lerp(cur, tar, 10) % 360;
      transform.eulerAngles = new Vector3(transform.eulerAngles.x, yrot, transform.eulerAngles.z);
    }
    // 값이 μ‘΄μž¬ν•œλ‹€λ©΄ 움직이기
    if(movement.sqrMagnitude != 0)
    {
      _rb.MovePosition(_rb.position + movement);
    }
  }
}

πŸ’» Execute

212

λ°©λ¬Έν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!😊

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°