Unity3D播放器在石头上穿行



大家好,我的玩家正在石头上穿过石头。名为Champ的玩家有一个长方体对撞机,石头有一个网格对撞机。玩家也有刚体。我尝试了所有我发现的东西,但没有任何东西能帮我解决问题。

MovePlayer.cs脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MovePlayer : MonoBehaviour
{
Rigidbody rb;
public float speed = 10f;
private Vector3 moveDirection;
public float rotationSpeed = 0.05f;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
moveDirection = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")).normalized;
}
void FixedUpdate()
{
rb.MovePosition(rb.position + transform.TransformDirection(moveDirection * speed * Time.deltaTime));
RotatePlayer();
}
void RotatePlayer()
{
if (moveDirection != Vector3.zero)
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(moveDirection.normalized), rotationSpeed);
}
transform.Translate(moveDirection * speed * Time.deltaTime, Space.World);
}
}

检查员中的播放器设置

检查员中的石头设置

场景预览

谢谢大家的帮助!:(

所以伙计们,我在上面发布的家伙的帮助下找到了解决方案。

问题是我的玩家速度在代码中太高了——速度在浮动10上,但我在玩家的Unity Inspector中将速度改为浮动50。

所以我解决这个问题的第一步是把速度降到10,但我仍然想以50f的速度移动。。。

这个问题的解决方案是,在Unity 2020.3.24f1及更高版本(可能更低(中,您可以转到编辑>项目设置>Physics并设置">默认最大穿透速度";达到你希望物体停止而不通过的速度。在我的情况下,我想以速度=50f移动,所以我需要将默认最大穿透速度更改为50

我希望我将来能帮助别人这个答案!

祝福最大G.

测试了您的代码,冲突似乎在我这边工作得很好。

通过将脚本添加到带有长方体碰撞器的GameObject中并使用立方体创建一个小级别来测试它。还做了一个墙,我修改为使用网格碰撞器而不是长方体碰撞器。玩家与场景中的物体正常碰撞。

您应该仔细检查ProjectSettings > Physics中的层碰撞矩阵,是否已将层播放器和墙设置为碰撞。

  1. 你也可以尝试在场景中添加新的立方体,并将其层设置为墙,看看玩家是否与它碰撞。如果碰撞了,那么石头的网格可能会出现问题
  2. 如果没有,我会从播放器中禁用动画师和重力体组件,以确保它们不会干扰碰撞

Rigidbody.MovePosition基本上让玩家进行传送,这会导致意想不到的行为。通常建议使用Rigidbody.AddForce。为了精确移动,可以使用CCD_ 4。

public float maxVelocityChange = 5.0f;
void moveUsingForces(){
Vector3 targetVelocity = moveDirection;
// Doesn't work with the given RotatePlayer implementation.
// targetVelocity = transform.TransformDirection(targetVelocity);
targetVelocity *= speed;
// Apply a force that attempts to reach our target velocity
Vector3 velocity = rb.velocity;
Vector3 velocityChange = (targetVelocity - velocity);
velocityChange.x = Mathf.Clamp(velocityChange.x, -maxVelocityChange, maxVelocityChange);
velocityChange.z = Mathf.Clamp(velocityChange.z, -maxVelocityChange, maxVelocityChange);
velocityChange.y = 0;
rb.AddForce(velocityChange, ForceMode.VelocityChange);
}

在这段代码中,您已经应用了两次motion,问题是使用了transform.Translate。请记住,Rigidbody类方法对碰撞器很敏感,可以识别它们,但变换不同,只应用点对点移位。为了解决这个问题,我认为您不需要在旋转部分使用translate的重复运动代码。

void RotatePlayer()
{
if (moveDirection != Vector3.zero)
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(moveDirection.normalized), rotationSpeed);
}
// removed translate
}

相关内容

  • 没有找到相关文章

最新更新