角色卡在墙上
Posted
技术标签:
【中文标题】角色卡在墙上【英文标题】:Character gets stuck to walls 【发布时间】:2021-08-08 17:17:33 【问题描述】:所以我对统一非常非常非常陌生,我在这里学习如何制作基本平台游戏的教程,这样我就可以学习基本的刚体控制和类似的东西
除了这一点之外,所有这些都很好,每当我进入墙壁时,我都会卡在那里,直到我松开作为我的移动键的 A 或 D。
这是我的代码,我已经尝试实施修复,但没有奏效并且进一步破坏了它。它将被注释掉并用注释突出显示它在我的代码中的位置
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class movementScript : MonoBehaviour
public float movementSpeed = 50;
public Rigidbody2D rb;
public LayerMask groundLayer;
public float jumpForce = 20f;
public Transform feet;
float mx;
private void Update()
Debug.Log(transform.position);
// me trying to fix the error
// if(isGrounded() && !rb.IsTouchingLayers())
// return;
//
// end of me trying to fix the error
mx = Input.GetAxis("Horizontal");
if (Input.GetButtonDown("Jump") && isGrounded())
jump();
private void FixedUpdate()
Vector2 movement = new Vector2(mx * movementSpeed, rb.velocity.y);
rb.velocity = movement;
void jump()
Vector2 movement = new Vector2(rb.velocity.x, jumpForce);
rb.velocity = movement;
public bool isGrounded()
Collider2D groundCheck =
Physics2D.OverlapCircle(feet.position, 0.5f, groundLayer);
if (groundCheck)
return true;
return false;
如果您需要,这就是我的项目的外观。 image of project here
【问题讨论】:
您正在用您自己的运动矢量覆盖游戏引擎设置的力。您可能想要的是AddForce
,而不是明确设置它:docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html
实际上,忽略这一点,我看到您已经采用了现有的 Y 速度 - 听起来您的接地检查是假设您已接地。你调试过地面检查吗?您使用的圆圈可能比您的角色更宽,因此在您接触墙壁时会检测到地面。
@Charleh 这应该不是问题,因为我的边界不在底层
尝试将Time.fixedDeltaTime
加到Vector2 movement = new Vector2(mx * movementSpeed, rb.velocity.y);
因为现在每个报价都将mx
乘以movementSpeed
,可能会创造很大的价值。我会推荐Vector2 movement = new Vector2(mx * movementSpeed * Time.fixedDeltaTime, rb.velocity.y);
@Charleh AddForce()
的原始答案有效,非常感谢您的帮助!
【参考方案1】:
好的,伙计们,通过使用 Charleh 的回答,我找到了一个几乎完美的解决方案,我唯一不喜欢的是它的控制速度非常慢。我的意思是它的加速和停止速度非常低。但它确实像以前一样工作和控制,现在它不会卡在墙上了。
所以我所做的只是将我的原始代码更改为这个
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class movementScript : MonoBehaviour
public float movementSpeed = 20;
public Rigidbody2D rb;
public LayerMask groundLayer;
public float jumpForce = 20f;
public Transform feet;
float mx;
private void Update()
Debug.Log(transform.position);
mx = Input.GetAxis("Horizontal");
if (Input.GetButtonDown("Jump") && isGrounded())
jump();
private void FixedUpdate()
Vector2 movement = new Vector2(mx * movementSpeed, rb.velocity.y);
rb.AddForce(movement);
void jump()
Vector2 movement = new Vector2(rb.velocity.x, jumpForce);
rb.velocity = movement;
public bool isGrounded()
Collider2D groundCheck = Physics2D.OverlapCircle(feet.position, 0.5f, groundLayer);
if (groundCheck)
return true;
return false;
我将播放器的 RigidBody2D 的线性拖动更改为 1
【讨论】:
另外我不知道为什么标签上写着它的 Unity3D 它应该是 Unity2D 抱歉,如果有任何混淆。 好吧,您可能需要重新考虑,因为AddForce
会给您带来很多惯性和动力类型的感觉 - 这对于某些游戏来说很好,但对于平台游戏等来说反应不是很好。如果它感觉还可以,那就留着吧。从技术上讲,摩擦是唯一让你的角色减速的因素,因为对物体施加力会导致它不断加速。
@human unity3d
和 unity2d
已合并为同义词,因为基本上它只是一种不同的渲染/物理方法,但我们仍然是同一个 Unity ;)以上是关于角色卡在墙上的主要内容,如果未能解决你的问题,请参考以下文章
Windows Server 2012 R2怎么配置域控制器
Windows Server 2012 R2怎么配置域控制器