-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCharacterControllerComponent.cpp
More file actions
171 lines (135 loc) · 4.61 KB
/
Copy pathCharacterControllerComponent.cpp
File metadata and controls
171 lines (135 loc) · 4.61 KB
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
#include "CharacterControllerComponent.h"
#include "CharacterControllerSystem.h"
void CharacterControllerComponent::OnStart()
{
m_transform = &GetOwner()->Transform_();
//m_fBaseSpeed = m_movementInfo.maxSpeed;
m_fBaseAcceleration = m_movementInfo.acceleration;
m_bMoveRestrict.fill(false);
}
// 트랙 C3 — CharacterControllerSystem 등ë¡/í•´ì§€. Awake/OnDestroy(위, ì»´í¬ë„ŒíŠ¸ë‹¹
// 1회 게ì´íЏ)ê°€ ì•„ë‹ˆë¼ ì”¬ 편입/ì´íƒˆ í›…ì„ ì“°ëŠ” ì´ìœ 는 CharacterControllerSystem.h
// ìƒë‹¨ ì£¼ì„ ì°¸ì¡° — DDOL 오브ì 트가 ì”¬ì„ ê±´ë„ ë•Œë„ ë§¤ë²ˆ 다시 ë¶ˆë ¤ì•¼ 하기 때문ì´ë‹¤.
// ì‹¤ì œ 파괴 경로(Scene::FlushPendingDestroy·PrefabUtility::ApplyComponentDiff)ë„
// 실 파괴(OnDestroy) ì§ì „ì— OnRemovingFromSceneì„ ë¨¼ì € 부르므로, ì´ ì‹œìŠ¤í…œì—서
// ë¹ ì§€ëŠ” 시ì ì´ í•ìƒ ì‹¤ 파괴보다 ë¨¼ì €ë‹¤.
void CharacterControllerComponent::OnAddedToScene()
{
CharacterControllerSystems->Register(this);
}
void CharacterControllerComponent::OnRemovingFromScene()
{
CharacterControllerSystems->Unregister(this);
}
void CharacterControllerComponent::OnFixedUpdate(float fixedDeltaTime)
{
//µî·ÏµÇÁö ¾ÊÀº ÄÁÆ®·Ñ·¯
if (m_controllerInfo.id == 0)
{
return;
}
math::vector3 input{};
input.x = m_moveInput.x;
input.z = m_moveInput.y;
/*if(m_isKnockBack)
{
input.y = JumpPower;
}*/
//Äɸ¯ÅÍ ÄÁÆ®·Ñ·¯
//todo : À̵¿ ºÒ°¡ÇÑ ½ºÅÏ »óÅ üũ ÇÊ¿ä --> ÇÊ¿ä½Ã Ãß°¡
m_bOnMove = input != math::vector3{};
input = math::normalize(input);
CharactorControllerInputInfo inputInfo;
inputInfo.id = m_controllerInfo.id;
inputInfo.input = input;
auto component = GetOwner()->GetComponent<RigidBodyComponent>();
if (!component) return;
inputInfo.isDynamic = component->GetBodyType() == EBodyType::DYNAMIC;
Physics->AddInputMove(inputInfo);
Physics->SetCharacterMovementMaxSpeed(inputInfo, m_movementInfo.maxSpeed);
if (m_useAutomaticRotation)
{
constexpr float rotationOffsetSquare = 0.5f * 0.5f;
math::vector3 lookDir = m_hasCustomLookDirection ? m_lookDirection : input;
lookDir.y = 0.f;
if (math::length_sq(lookDir) >= rotationOffsetSquare) {
lookDir = math::normalize(lookDir);
// yaw °è»ê: Z°¡ ¾ÕÀ̹ǷΠ(z, x) ¼ø¼ ÁÖÀÇ
float targetYaw = std::atan2(lookDir.z, lookDir.x) - math::half_pi; // ¶óµð¾È °ª
targetYaw = -targetYaw;
// ÇöÀç ȸÀü¿¡¼ yaw¸¸ ÃßÃâ
const math::vector3 currentEuler =
math::to_euler(m_transform->GetWorldQuaternion());
float currentYaw = currentEuler.y;
// Slerp ´ë½Å float º¸°£µµ °¡´ÉÇÏÁö¸¸, Quaternion À¯ÁöÇÏ·Á¸é ÀÌ·¸°Ô:
const math::quaternion currentRot = math::quaternion_from_pitch_yaw_roll(0.0f, currentYaw, 0.0f);
const math::quaternion targetRot = math::quaternion_from_pitch_yaw_roll(0.0f, targetYaw, 0.0f);
const math::quaternion resultRot = math::slerp(currentRot, targetRot, m_rotationSpeed * fixedDeltaTime);
m_transform->SetRotation(resultRot);
}
}
ClearLookDirection();
}
void CharacterControllerComponent::OnLateUpdate(float fixedDeltaTime)
{
m_movementInfo.maxSpeed = m_fBaseSpeed * m_fFinalMultiplierSpeed;
m_movementInfo.acceleration = m_fBaseAcceleration * m_fFinalMultiplierSpeed;
//m_fFinalMultiplierSpeed = 1.0f;
}
void CharacterControllerComponent::ForcedSetPosition(const math::vector3& pos)
{
PhysicsManagers->SetControllerPosition(m_controllerInfo.id, pos);
}
void CharacterControllerComponent::SetAutomaticRotation(bool useAuto)
{
m_useAutomaticRotation = useAuto;
}
void CharacterControllerComponent::TriggerForcedMove(
const math::vector3& initialVelocity, float duration)
{
Physics->ApplyForcedMoveToCCT(
m_controllerInfo.id, initialVelocity, duration);
}
void CharacterControllerComponent::StopForcedMove()
{
Physics->StopForcedMoveOnCCT(m_controllerInfo.id);
}
bool CharacterControllerComponent::IsInForcedMove() const
{
return Physics->IsInForcedMove(m_controllerInfo.id);
}
void CharacterControllerComponent::SetLookDirection(const math::vector3& direction)
{
m_lookDirection = direction;
m_hasCustomLookDirection = true;
}
void CharacterControllerComponent::ClearLookDirection()
{
m_hasCustomLookDirection = false;
}
void CharacterControllerComponent::OnTriggerEnter(ICollider* other)
{
++m_collsionCount;
}
void CharacterControllerComponent::OnTriggerStay(ICollider* other)
{
}
void CharacterControllerComponent::OnTriggerExit(ICollider* other)
{
if (m_collsionCount != 0) {
--m_collsionCount;
}
}
void CharacterControllerComponent::OnCollisionEnter(ICollider* other)
{
++m_collsionCount;
}
void CharacterControllerComponent::OnCollisionStay(ICollider* other)
{
}
void CharacterControllerComponent::OnCollisionExit(ICollider* other)
{
if (m_collsionCount != 0) {
--m_collsionCount;
}
}