Day1
通过引入路径找到类型
根据角色进入方向开门(向量运算、几何概念、点乘)
-
向量的减法:
OtherActor->GetActorLocation() - GetActorLocation()
这一部分是计算两个位置向量之间的差向量,即门的位置向量减去角色的位置向量,得到了一个从门指向角色的向量。 -
向量的归一化:
V1.GetSafeNormal()
这一部分是将差向量归一化,即将向量的长度调整为1,这样做的目的是为了得到一个表示方向的单位向量,而不关心具体的长度。 -
点乘运算:
FVector::DotProduct(GetActorRightVector(), V1)
这一部分是计算门的右侧向量与角色进入方向向量的点乘。点乘的结果可以用来判断两个向量之间的夹角关系,从而确定进入角色的位置相对于门的位置是在门的左侧还是右侧。 -
几何概念: 根据点乘的结果,代码确定了门的开启方向。如果点乘结果大于0,则进入角色在门的右侧,门应该向着负方向开启;如果点乘结果小于0,则进入角色在门的左侧,门应该向着正方向开启。这涉及到了几何中向量的方向和夹角的关系。
曲线的应用
向量点乘 计算夹角
2个夹角余弦值
计算角色移动的方向(点乘)
-
获取移动方向: 使用
GetVelocity()
方法获取角色的移动速度向量,并使用GetSafeNormal()
方法将其归一化,以获取移动方向。 -
计算移动方向与角色正方向的夹角: 使用点乘运算
FVector::DotProduct()
计算移动方向向量和角色正方向向量的点乘结果,从而得到它们之间的夹角的余弦值。 -
将余弦值转换为角度: 使用反余弦函数
FMath::Acos()
将余弦值转换为夹角的弧度值,并将其转换为角度制。 -
根据移动方向与角色右侧向量的点乘结果调整角度方向: 如果移动方向向量与角色右侧向量的点乘结果小于0,则将计算得到的角度方向乘以-1,以确保角度方向的正确性。
FVector MoveDir = MyCharacter->GetVelocity().GetSafeNormal();
//移动速度与角色正方向夹角
float DotValue = FVector::DotProduct(MoveDir, MyCharacter->GetBaseAimRotation().Vector());
//反余弦 注意反余弦的单位是弧度,需要将弧度转为角度
Direction = FMath::Acos(DotValue) * 180 / 3.14f;
if (FVector::DotProduct(MoveDir, MyCharacter->GetActorRightVector()) < 0)
{
Direction *= -1;
}
bIronsight = MyCharacter->IsIronsight();
//加速度方向和正方向的夹角 = 余弦
//反余弦
判断角色是否向前奔跑(点乘)
bool ALGCharacterBase::IsSprinting()
{
if (GetHoldWeapon())
{
return bSprint
&& !bIsCrouched
&& FVector::DotProduct(GetVelocity().GetSafeNormal(), GetActorForwardVector()) > .9f;
}
return bSprint && !bIsCrouched;
}
GetVelocity().GetSafeNormal()
:获取角色当前的速度向量,并将其归一化,以得到角色的移动方向。GetActorForwardVector()
:获取角色当前正前方的向量。FVector::DotProduct()
:计算移动方向向量和正前方向向量的点乘结果。
如果这个点乘结果大于0.9(在1附近),那么可以理解为角色的移动方向与正前方向相近。这种检查可能用于一些游戏中的特定功能或者行为,比如判断角色是否在直线上高速移动,或者在进行某些特殊动作时的判断。
节点
API
HUD取角色指针 : GetOwningPawn();
Tips
- 改组件关编译器
- 常量都应该暴露成参数