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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public partial class SaionjiScript : MonoBehaviour
{
/// <summary>
/// ability system
/// </summary>
AbilitySystem m_AbilitySystem = new AbilitySystem();
ConditionBase Not(ConditionBase cond)
{
return new ConditionNot(cond);
}
ConditionBase And(ConditionBase c1, ConditionBase c2)
{
return new ConditionAnd(c1, c2);
}
ConditionBase Or(ConditionBase c1, ConditionBase c2)
{
return new ConditionOr(c1,c2);
}
/// <summary>
/// 设置abilities
/// </summary>
void SetupAbilities()
{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// abilities
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
IdleAbility idle = new IdleAbility(animator, Anim_Idle);
MoveAbility move = new MoveAbility(animator, Anim_Run);
MoveAbility dash = new MoveAbility(animator, Anim_DashWithSword);
AttackAbility attk1 = new AttackAbility(animator, Anim_LightAttack1);
AttackAbility attk2 = new AttackAbility(animator, Anim_LightAttack2);
AttackAbility attk3 = new AttackAbility(animator, Anim_LightAttack3);
AttackAbility attk4 = new AttackAbility(animator, Anim_LightAttack4);
AttackAbility attk5 = new AttackAbility(animator, Anim_LightAttack5);
AttackAbility sideKick = new AttackAbility(animator, Anim_SideKick);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// actions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ActionTurn180 turn180 = new ActionTurn180(this.transform);
ActionTowardLeft towardLeft = new ActionTowardLeft(this.transform);
ActionTowardRight towardRight = new ActionTowardRight(this.transform);
ActionSwitchAbility switchToMove = new ActionSwitchAbility(m_AbilitySystem, move);
ActionSwitchAbility switchToIdle = new ActionSwitchAbility(m_AbilitySystem, idle);
ActionSwitchAbility switchToAttk1 = new ActionSwitchAbility(m_AbilitySystem, attk1);
ActionSwitchAbility switchToAttk2 = new ActionSwitchAbility(m_AbilitySystem, attk2);
ActionSwitchAbility switchToAttk3 = new ActionSwitchAbility(m_AbilitySystem, attk3);
ActionSwitchAbility switchToAttk4 = new ActionSwitchAbility(m_AbilitySystem, attk4);
ActionSwitchAbility switchToAttk5 = new ActionSwitchAbility(m_AbilitySystem, attk5);
ActionSwitchAbility switchToSideKick = new ActionSwitchAbility(m_AbilitySystem, sideKick);
ActionSwitchAbility switchToDash = new ActionSwitchAbility(m_AbilitySystem, dash);
ActionWipeCmdRecord wipeCmdRecord = new ActionWipeCmdRecord();
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// conditions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ConditionCommand condLeftCmd = new ConditionCommand(GamepadButton.Left);
ConditionCommand condRightCmd = new ConditionCommand(GamepadButton.Right);
ConditionNoMoveButtonHold condNoMoveButtonHold = new ConditionNoMoveButtonHold();
ConditionButtonHold condRightButtonHold = new ConditionButtonHold(GamepadButton.Right);
ConditionButtonHold condLeftButtonHold = new ConditionButtonHold(GamepadButton.Left);
ConditionCommand condCircleCmd = new ConditionCommand(GamepadButton.Circle);
ConditionCommand condCrossCmd = new ConditionCommand(GamepadButton.Cross);
ConditionTowardLeft condTowardLeft = new ConditionTowardLeft(this.transform);
ConditionTowardRight condTowardRight = new ConditionTowardRight(this.transform);
ConditionCommandSeq condRight2Cmd = new ConditionCommandSeq(new List<GamepadButton>{GamepadButton.Right, GamepadButton.Right }, 1f);
ConditionCommandSeq condLeft2Cmd = new ConditionCommandSeq(new List<GamepadButton>{GamepadButton.Left, GamepadButton.Left }, 1f);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// common triggers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Trigger triggerTurnRight = new Trigger(And(condRightButtonHold, Not(condTowardRight)), towardRight);
Trigger triggerTurnLeft = new Trigger(And(condLeftButtonHold, Not(condTowardLeft)), towardLeft);
Trigger trigger = null;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ability setup
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// idle ability
trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List<ActionBase> { wipeCmdRecord , switchToDash });
idle.AddTrigger(trigger);
trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List<ActionBase> { wipeCmdRecord , switchToDash });
idle.AddTrigger(trigger);
trigger = new Trigger(And(condRightButtonHold, Not(condRight2Cmd)), new List<ActionBase> { switchToMove, towardRight });
idle.AddTrigger(trigger);
trigger = new Trigger(And(condLeftButtonHold, Not(condLeft2Cmd)), new List<ActionBase> { switchToMove, towardLeft });
idle.AddTrigger(trigger);
trigger = new Trigger(condCircleCmd, switchToAttk1);
idle.AddTrigger(trigger);
trigger = new Trigger(condCrossCmd, switchToSideKick);
idle.AddTrigger(trigger);
trigger = new Trigger(condLeftCmd, turn180);
idle.AddTrigger(trigger);
// move ability
trigger = new Trigger(And(condTowardRight, And(condRightCmd, condRight2Cmd)), new List<ActionBase> { wipeCmdRecord, switchToDash, });
move.AddTrigger(trigger);
trigger = new Trigger(And(condTowardLeft, And(condLeftCmd, condLeft2Cmd)), new List<ActionBase> { wipeCmdRecord, switchToDash });
move.AddTrigger(trigger);
trigger = new Trigger(And(condTowardRight, Not(condRightButtonHold)), switchToIdle);
move.AddTrigger(trigger);
trigger = new Trigger(And(condTowardLeft, Not(condLeftButtonHold)), switchToIdle);
move.AddTrigger(trigger);
trigger = new Trigger(condCircleCmd, switchToAttk1);
move.AddTrigger(trigger);
trigger = new Trigger(condCrossCmd, switchToSideKick);
move.AddTrigger(trigger);
// dash ability
trigger = new Trigger(new ConditionAnimAtEnd(animator, Anim_DashWithSword), switchToIdle);
dash.AddTrigger(trigger);
// attack abilities
float expireTime = 0.3f;
ConditionAnimAtEnd condAttk1AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack1);
trigger = new Trigger(And(condAttk1AtEnd, condCircleCmd), switchToAttk2);
attk1.AddTrigger(trigger);
ConditionAttkExpireTime condAttk1ExpireTime = new ConditionAttkExpireTime(attk1, expireTime);
trigger = new Trigger(condAttk1ExpireTime, switchToIdle);
attk1.AddTrigger(trigger);
attk1.AddTrigger(triggerTurnRight);
attk1.AddTrigger(triggerTurnLeft);
ConditionAnimAtEnd condAttk2AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack2);
trigger = new Trigger(And(condAttk2AtEnd, condCircleCmd), switchToAttk3);
attk2.AddTrigger(trigger);
ConditionAttkExpireTime condAttk2ExpireTime = new ConditionAttkExpireTime(attk2, expireTime);
trigger = new Trigger(condAttk2ExpireTime, switchToIdle);
attk2.AddTrigger(trigger);
attk2.AddTrigger(triggerTurnRight);
attk2.AddTrigger(triggerTurnLeft);
ConditionAnimAtEnd condAttk3AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack3);
trigger = new Trigger(And(condAttk3AtEnd, condCircleCmd), switchToAttk4);
attk3.AddTrigger(trigger);
ConditionAttkExpireTime condAttk3ExpireTime = new ConditionAttkExpireTime(attk3, expireTime);
trigger = new Trigger(condAttk3ExpireTime, switchToIdle);
attk3.AddTrigger(trigger);
attk3.AddTrigger(triggerTurnRight);
attk3.AddTrigger(triggerTurnLeft);
ConditionAnimAtEnd condAttk4AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack4);
trigger = new Trigger(And(condAttk4AtEnd, condCircleCmd), switchToAttk5);
attk4.AddTrigger(trigger);
ConditionAttkExpireTime condAttk4ExpireTime = new ConditionAttkExpireTime(attk4, expireTime);
trigger = new Trigger(condAttk4ExpireTime, switchToIdle);
attk4.AddTrigger(trigger);
attk4.AddTrigger(triggerTurnRight);
attk4.AddTrigger(triggerTurnLeft);
ConditionAnimAtEnd condAttk5AtEnd = new ConditionAnimAtEnd(animator, Anim_LightAttack5);
trigger = new Trigger(condAttk5AtEnd, switchToIdle);
attk5.AddTrigger(trigger);
ConditionAttkExpireTime condAttk5ExpireTime = new ConditionAttkExpireTime(attk5, expireTime);
trigger = new Trigger(condAttk5ExpireTime, switchToIdle);
attk5.AddTrigger(trigger);
attk5.AddTrigger(triggerTurnRight);
attk5.AddTrigger(triggerTurnLeft);
ConditionAttkExpireTime condSideKickExpireTime = new ConditionAttkExpireTime(sideKick, expireTime);
trigger = new Trigger(condSideKickExpireTime, switchToIdle);
sideKick.AddTrigger(trigger);
m_AbilitySystem.ForceStart(idle);
}
}
|