C# 我的球员动作出现了一些问题
我开始学习Unity的C#,我想我的代码出现了一些问题,我的播放器运行正常,但不是很好。让我解释一下,我在屏幕底部有一个播放器,使用transform.translate(我没有使用刚体)只从左向右移动,因为在与侧面碰撞时它会停止,并且不是一个恒定的运动,其思想是,一旦与侧面碰撞,它会改变方向,但速度相同 当播放器与墙合并(移除网格渲染器以保持其透明)时,会发生此问题,但如果同时按下该键以触发方向更改,则播放器会卡在角落处,如此gif示例所示: 等待玩家卡在角落,gif需要15秒 这是我给玩家的真实剧本C# 我的球员动作出现了一些问题,c#,unity3d,C#,Unity3d,我开始学习Unity的C#,我想我的代码出现了一些问题,我的播放器运行正常,但不是很好。让我解释一下,我在屏幕底部有一个播放器,使用transform.translate(我没有使用刚体)只从左向右移动,因为在与侧面碰撞时它会停止,并且不是一个恒定的运动,其思想是,一旦与侧面碰撞,它会改变方向,但速度相同 当播放器与墙合并(移除网格渲染器以保持其透明)时,会发生此问题,但如果同时按下该键以触发方向更改,则播放器会卡在角落处,如此gif示例所示: 等待玩家卡在角落,gif需要15秒 这是我给玩家
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PMovement : MonoBehaviour
{
public float playerSpeed = 8.0f;
void Update()
{
float moveX = playerSpeed * Time.deltaTime;
transform.Translate(moveX, 0, 0);
if (Input.GetKeyUp(KeyCode.Space))
{
playerSpeed = playerSpeed * -1;
}
}
void OnCollisionEnter(Collision target)
{
if (target.gameObject.tag.Equals("SideWalls") == true)
{
playerSpeed = playerSpeed * -1;
}
}
}
您的代码看起来符合您想要实现的目标。不幸的是,在Unity中,指出问题可能还不够,因为代码严重依赖于编辑器的设置。此问题或类似问题的一种可能解决方案: 如果仍然有阻塞碰撞器(碰撞功能需要某种刚体),或者如果夹紧玩家的位置以停止溢出,则可能发生以下情况:
- 右侧的对撞机被击中
- 球员方向向左改变
- 当碰撞器仍在碰撞时,空间被击中
- 玩家方向再次向右改变
- 右侧和左侧没有可再次启动colliderEnter事件的碰撞器
在这种情况下,当玩家触摸一面时,阻止你的空格识别。如果你在撞墙时改变方向,但在正确的时间按空格键,那么你很可能会在墙内结束。然后它会一直认为它正在撞墙,并一次又一次地反转方向。这是我要做的
public class PMovement : MonoBehaviour
{
private List<GameObject> Collisions = new List<GameObject>();
public float playerSpeed = 8.0f;
void Update()
{
float moveX = playerSpeed * Time.deltaTime;
transform.Translate(moveX, 0, 0);
if (Collisions.Count <= 0 && Input.GetKeyUp(KeyCode.Space))
{
playerSpeed = playerSpeed * -1;
}
}
void OnCollisionEnter(Collision target)
{
if (!Collisions.Contains(target.gameObject) && target.gameObject.tag.Equals("SideWalls") == true)
{
Collisions.Add(target.gameObject);
playerSpeed = playerSpeed * -1;
}
}
void OnCollisionExit(Collision target)
{
if (Collisions.Contains(target.gameObject)) {
Collisions.Remove(target.gameObject);
}
}
}
公共类PMovement:monobhavior
{
私有列表冲突=新列表();
公共花车播放机速度=8.0华氏度;
无效更新()
{
float moveX=播放器速度*Time.deltaTime;
transform.Translate(moveX,0,0);
if(Collisions.Count我已经尝试过了,但没有成功void OnCollisionEnter(碰撞目标){if(target.gameObject.tag.Equals(“侧壁”){toiletteSpeed=toiletteSpeed*-1;}}}void OnCollisionExit(碰撞目标){if(target.gameObject.tag.Equals(“侧壁”)){if(Input.GetKeyUp(KeyCode.Space)){toiletteSpeed=toiletteSpeed*-1;}}}有没有一种方法可以在不减速的情况下使用velocity或AddForce来实现这一点?@Ayjaykay在退出或进入的帧中会调用一次enter和exit方法。您可以使用OnCollisionStay并保存一个标志isTouching
或其他内容。您需要在更新循环中抑制空间识别,而不是在其中一个帧上对撞机方法。我相信有一个输入错误:同一个方法不能定义两次。:)如果你的意思是从列表中删除时退出:关键是省略了空格输入,是的,但不是因为方向来回变化被触发:碰撞器接触时不会在每一帧调用enter和exit方法。是的,这是一个输入错误。我也知道只有在进入时才会调用enter,只有在退出时才会调用exitting。但是,如果玩家与墙碰撞,改变方向,然后在碰撞完全退出之前再次点击空格以改变方向,那么根据墙碰撞器的设置方式,他们可能会卡在墙上。可以通过OnCollisionCenter中的调试日志或其他方式轻松进行测试。