我希望我的角色在每次碰到屏幕/画布的边缘时都停下来,所以我在每个边框的末尾添加了一个矩形(带有2d碰撞器),所以我的角色会与它碰撞并停止在其中移动方向,但事实是,例如,如果我击中了左矩形,而我仍然按A向左移动,我的角色就会“摇晃”。我试图通过将其碰到某个矩形时将其速度设置为0来解决该问题,但是到达边缘后,我无法向任何方向移动。
public class CharacterMovement : MonoBehaviour {
public float speed = 5f;
void Start() {
}
void Update() {
if (Input.GetKey(KeyCode.W))
{
transform.Translate(0, speed * Time.deltaTime, 0);
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(0, -speed * Time.deltaTime, 0);
}
if (Input.GetKey(KeyCode.A))
{
transform.Translate(-speed * Time.deltaTime, 0, 0);
}
if (Input.GetKey(KeyCode.D))
{
transform.Translate(speed * Time.deltaTime, 0, 0);
}
}
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.name == "offscreen")
{
speed = 0f;
}else
{
speed = 5f;
}
}
}
答案 0 :(得分:1)
我不熟悉单声道行为方法,但是我认为问题是当您等于边缘时,它对于下一次更新仍然适用。由于没有错误,速度保持为0。
请尝试将选中的每个检查项放入更新方法中。
类似
if (key ==moveleft)
{
if(sprite.leftedge>edgeoftheleftscreen+1)
Sprite.moveleft();
}
if(key==moveright)
{
if(sprite.rightedge<edgeoftherightscreen-1)
Sprite.moveright();
}
希望这会有所帮助。
答案 1 :(得分:1)
发生抖动,是因为您只是将角色放置在边界的对撞机中,而物理正试图将其带回。 在这种情况下,我不是很喜欢依靠对撞机。假设您将角色设置为非常高的速度或丢帧,并且角色可能出现在对撞机的另一侧,或者至少会再次发生晃动。我要做的是检查是否要点:
deltaPos = speed * Time.deltaTime
transform.position + deltaPos
在屏幕外。如果是这样,则应将deltaPos固定到屏幕边框的距离。
答案 2 :(得分:1)
尝试在角色与侧面碰撞时禁用单个输入,这样,您可以在触摸侧面后移到另一侧,而不是将速度设置为0。
当前存在的问题是,当您与侧面碰撞时,您在仍触摸侧面的同时将速度设置为0,并且您无法从不断触摸的侧面移开,因为速度是0。
public class CharacterMovement : MonoBehaviour {
public float speed = 5f;
public bool touchingLeft;
public bool touchingRight;
void Start() {
}
void Update() {
if (Input.GetKey(KeyCode.W))
{
transform.Translate(0, speed * Time.deltaTime, 0);
}
if (Input.GetKey(KeyCode.S))
{
transform.Translate(0, -speed * Time.deltaTime, 0);
}
if (Input.GetKey(KeyCode.A) && !touchingLeft)
{
transform.Translate(-speed * Time.deltaTime, 0, 0);
touchingRight = false;
}
if (Input.GetKey(KeyCode.D) && !touchingRight)
{
transform.Translate(speed * Time.deltaTime, 0, 0);
touchingLeft = false;
}
}
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.name == "leftOffscreen")
{
touchingLeft = true;
}
if else (col.gameObject.name == "rightOffscreen")
{
touchingRight = true;
}
}
}
但是,有更有效的方法来执行此操作,但是我觉得这对您现有的代码很有效。
如果屏幕尺寸改变了,您可能希望将播放器的x值固定在屏幕边缘的x值上。
希望有帮助