(3D RPG) 스킬
포스트
취소

(3D RPG) 스킬

구현 기간 : 05.14 ~ 05.16

스킬을 구현할때 EffectAnimation을 맞춰주는게 좀 까다로웠고,

협업이나 내가 만든 것이 아니기에 에셋에 대한 적응이 어려웠다.

🎮 구현 기능

📝 스킬 데이터

SkillData

💻 PlayerAnimEvent.cs

스킬을 사용할 때마다 공격 범위가 바뀌기 때문에 하나하나 수치를 저장해 관리했다.

범위가 다른 콤보 스킬은 배열로 저장하고 같은 범위의 스킬은 하나의 변수로 저장했다.

함수가 호출되는 방법은 유니티에 애니메이션 Event를 통해 호출한다.

[ Source Code (Click) ]
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
// 공격마다 각 사거리가 다르므로 여기서 관리
public class PlayerAnimEvent : MonoBehaviour
{
    [SerializeField]
    private CapsuleCollider capsuleCollider;

    private int nextSkillIndex = 0;

    private const int X_Axis = 0, Y_Axis = 1, Z_Axis = 2;

#region 공격 사거리

    // 공격 사이즈 클래스
    public class AttackSize
    {
        public float x;
        public float y;
        public float z;
        public float redius;
        public float height;
        public int direction;   // x: 0, y: 1, z: 2
    }

    // Id 101 공격 범위 (트리플 슬래쉬)
    private AttackSize skill101 = new AttackSize()
    {
        x = 0, y = 0, z = -0.35f, redius = 2.35f, height = 4.5f, direction = Y_Axis,
    };

    // Id 102 공격 범위 (라이징 슬래쉬)
    private AttackSize[] skill102 = new AttackSize[]
    {
        new AttackSize()
        {
            x = 0.3f, y = 0, z = 1.23f, redius = 0.5f, height = 3.5f, direction = Z_Axis,
        },
        new AttackSize()
        {
            x = 0.43f, y = 0.56f, z = 1f, redius = 0.93f, height = 3.6f, direction = Y_Axis,
        },
        new AttackSize()
        {
            x = 0, y = 0, z = 0f, redius = 2.35f, height = 4.5f, direction = Y_Axis,
        },
    };

    // Id 103 공격 범위 (회전의 칼날)
    private AttackSize skill103 = new AttackSize()
    {
        x = -0.4f, y = 0, z = -0.6f, redius = 4.4f, height = 8.7f, direction = Y_Axis,
    };

    // Id 104 공격 범위 (어둠의 칼날)
    private AttackSize skill104 = new AttackSize()
    {
        x = 0, y = 0, z = -0.4f, redius = 2.8f, height = 5.5f, direction = Y_Axis,
    };

    // Id 105 공격 범위 (궁극의 일격)
    private AttackSize skill105 = new AttackSize()
    {
        x = 0, y = 0, z = 6.1f, redius = 1.2f, height = 11.7f, direction = Z_Axis,
    };

    // Id 106 공격 범위 (칼날 섬멸)
    private AttackSize[] skill106 = new AttackSize[]
    {
        new AttackSize()
        {
            x = 0f, y = 0, z = 0.13f, redius = 1.23f, height = 3.4f, direction = X_Axis,
        },
        new AttackSize()
        {
            x = 0f, y = 0f, z = 3.5f, redius = 3f, height = 9.4f, direction = X_Axis,
        },
        new AttackSize()
        {
            x = 0f, y = 0f, z = 3.5f, redius = 3f, height = 9.4f, direction = X_Axis,
        },
        new AttackSize()
        {
            x = 0f, y = 0f, z = 3.5f, redius = 3f, height = 9.4f, direction = X_Axis,
        },
    };

    // Id 107 공격 범위 (궁극의 칼날)
    private AttackSize skill107 = new AttackSize()
    {
        x = 0f, y = 0f, z = -0.4f, redius = 7f, height = 0f, direction = Y_Axis,
    };

#endregion

    // 기본 검 공격
    public void OnBasicAttack()
    {
        capsuleCollider.gameObject.SetActive(true);
    }

    // skill 101 : 트리플 슬래쉬
    public void OnTripleSlash()
    {
        OnSize(skill101);
    }

    // skill 102 : 라이징 슬래쉬
    public void OnRisingSlash()
    {
        OnSize(skill102[nextSkillIndex]);
        
        ++nextSkillIndex;
        if (nextSkillIndex == skill102.Length)
            nextSkillIndex = 0;
    }

    // skill 103 : 회전의 칼날
    public void OnRotationBlade()
    {
        OnSize(skill103);
    }

    // skill 104 : 어둠의 칼날
    public void OnDarkBlade()
    {
        OnSize(skill104);
    }

    // skill 105 : 궁극의 일격
    public void OnBigSwordSlash()
    {
        OnSize(skill105);
    }

    // skill 106 : 칼날 섬멸
    public void OnBladeAnnihilation()
    {
        OnSize(skill106[nextSkillIndex]);
        
        ++nextSkillIndex;
        if (nextSkillIndex == skill106.Length)
            nextSkillIndex = 0;
    }

    // skill 107 : 궁극의 칼날
    public void OnEventualityBlade()
    {
        OnSize(skill107);
    }

    private void OnSize(AttackSize size)
    {
        capsuleCollider.gameObject.SetActive(true);
        SetSize(size);
    }

    private void SetSize(AttackSize size)
    {
        capsuleCollider.direction = size.direction;
        capsuleCollider.center = new Vector3(size.x, size.y, size.z);
        capsuleCollider.radius = size.redius;
        capsuleCollider.height = size.height;
    }
}

🎬 구현 영상

스킬을 사용하면 콜라이더의 크기가 바꾸니느 것을 확인할 수 있다. Skill

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.