尝试在Unity中制作一款自上而下的射击游戏。使用 2D (URP) 核心。每当玩家以某种方式与墙壁碰撞(从侧面滑落或与墙角碰撞)时,玩家就会开始抖动并在没有输入的情况下缓慢移动。它还朝鼠标的方向移动。我该如何解决这个问题?
玩家脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayerMovement : MonoBehaviour
{
[SerializeField]
private float movespeed;
[SerializeField]
private float rotspeed;
[SerializeField]
private Camera cam;
[SerializeField]
private Animator animator;
private Rigidbody2D rb;
private Vector2 moveInput;
private void Awake()
{
rb = GetComponent<Rigidbody2D>();
}
private void Update()
{
animator.SetFloat("Speed", rb.velocity.sqrMagnitude);
}
private void FixedUpdate()
{
SetPlayerVel();
RotateInDirectionofCursor();
}
private void SetPlayerVel()
{
rb.velocity = moveInput * movespeed * Time.deltaTime;
}
private void RotateInDirectionofCursor()
{
Vector2 mouseWorldPos = cam.ScreenToWorldPoint(Input.mousePosition);
transform.up = (mouseWorldPos - new Vector2(transform.position.x, transform.position.y)) * -1;
}
private void OnMove(InputValue inputValue)
{
moveInput = inputValue.Get<Vector2>();
}
其他组件:
玩家:
墙:(这是在瓦片地图网格下)
我尝试将玩家移动到 rb.MovePosition 的方式以及玩家与墙壁碰撞的方式更改为脚本。两者都不起作用,虽然我不精通Unity,所以我可能不明白问题是什么。
当玩家的物理与墙壁发生碰撞并导致玩家被卡住或被困时,就会发生这种类型的抖动和无输入的缓慢移动。以下是尝试解决此问题的一些建议:
您可以尝试调整玩家碰撞体的物理材质,以减少玩家与墙壁之间的摩擦力。这可以通过改变物理材料的摩擦和弹跳属性来完成。
增加玩家的质量可以使其在与墙壁碰撞时不太可能被卡住或被困。这可以通过调整玩家的 Rigidbody 组件的质量属性来完成。
确保玩家的碰撞器的形状和大小适合您的游戏,通常胶囊碰撞器最适合玩家控制器。如果碰撞体太大或太小,都会导致玩家在与墙壁碰撞时卡住或抖动。
希望这些建议中的一项或多项能够帮助您解决问题。
这是一个有用的提示。在墙上,我也遇到了同样的问题。然而,我使用的是 2D 瓷砖地图。我将平台效应器 2D 组件添加到我的块和墙壁上。它解决了我的问题。确保添加平台效应器时,在任何有效的碰撞器(例如 BoxCollider2D 或 PolygonCollider2D)中选中“由效应器使用”复选框。 我不确定这是否有帮助,但值得一试。