我在解决这个问题时遇到了一些麻烦。我想要实现的是一种解决动作。玩家从远处刺向目标。
该图显示了设置。蓝色钻石是玩家,红色钻石是目标。紫色框是目标SkinnedMeshRenderer的渲染器边界。我正在使用渲染器边界,因为某些目标的网格比其他网格要大得多。目前,该玩家正在向橙色星球射击......这是不现实的。我希望他,无论目标面向什么样的方向,总是瞄准目标最近的相对于他位置的点......在图中的情况是棕色的星。这是我一直在使用的代码......
public IEnumerator Blitz()
{
rigidbody.velocity = Vector3.zero; //ZERO OUT THE RIGIDBODY VELOCITY TO GET READY FOR THE BLITZ
SkinnedMeshRenderer image = target.GetComponentInChildren<SkinnedMeshRenderer>();
Vector3 position = image.renderer.bounds.center + image.renderer.bounds.extents;
position.y = target.transform.position.y;
while(Vector3.Distance(transform.position, position) > 0.5f)
{
transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * 10);
yield return null;
}
Results(); //IRRELEVANT TO THIS PROBLEM. THIS CALCULATES DAMAGE.
Blitz.Stop(); //THE PARTICLE EFFECT ASSOCIATED WITH THE BLITZ.
GetComponent<Animator>().SetBool(moveName, false); //TRANSITIONS OUT OF THE BLITZ ANIMATION
GetComponent<Input>().NotAttacking(); //LET'S THE INPUT SCRIPT KNOW THE PLAYER CAN HAVE CONTROL BACK.
}
答案 0 :(得分:0)
//Get the derection to tarvel in and normalize it to length of 1
Vector3 Direction = (Target - transform.position).normalized
使用Direction,你可以做很多事情。例如,您可以将方向乘以您的速度并将其添加到您的位置。
transform.position += Direction * MoveSpeed;
如果你想到达最近的点,你可以使用方便的Collider.ClosestPointOnBounds方法。
Target = TargetObject.GetComponent<Collider>().ClosestPointOnBounds(transform.position)
并将Target插入用于获取方向的代码中。
或者,您可以使用Vector3.Lerp而不获取方向,因为它只是插值。
transform.position = Vector3.Lerp(Target,transform.position,time.DeltaTime);
要在目标点停留,您可以使用到达行为。
//Declare the distance to start slowing down
float ClosingDistance = Speed * 2;
//Get the distance to the target
float Distance = (Target - transform.position).magnitude;
//Check if the player needs to slow down
if (Distance < ClosingDistance)
{
//If you're closer than the ClosingDistance, move slower
transform.position += Direction * (MoveSpeed * Distance / ClosingDistance);
}
else{
//If not, move at normal speed
transform.position += Directino * MoveSpeed;
}