μ‘°μ΄μ€ν±
νκ·Έ: Joystick, PoliceAndThief, Unity
μΉ΄ν κ³ λ¦¬: PoliceAndThief
π Joystick
λͺ¨λ°μΌ κ²μμ λλΆλΆ μ‘°μ΄μ€ν±μ μ΄μ©ν΄ μΊλ¦ν°λ₯Ό μ΄λμν¨λ€.
κ°λ¨ν μ‘°μ΄μ€ν± μμ μ μ΄μ©ν΄ μ΄λ₯Ό ꡬνν΄λ³΄μ.
π Asset
Nice Touch λΌλ μ λ£μμ μ μ¬μ©νλ€.
Unity Live λ₯Ό λ³΄κ³ κ³΅μ§λ‘ λ°μλ μμ μ΄λΌ μ¬μ©ν΄λ³΄μλ€.
π μ리
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);
}
}
}
λκΈλ¨κΈ°κΈ°