Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的球员动作出现了一些问题_C#_Unity3d - Fatal编程技术网

C# 我的球员动作出现了一些问题

C# 我的球员动作出现了一些问题,c#,unity3d,C#,Unity3d,我开始学习Unity的C#,我想我的代码出现了一些问题,我的播放器运行正常,但不是很好。让我解释一下,我在屏幕底部有一个播放器,使用transform.translate(我没有使用刚体)只从左向右移动,因为在与侧面碰撞时它会停止,并且不是一个恒定的运动,其思想是,一旦与侧面碰撞,它会改变方向,但速度相同 当播放器与墙合并(移除网格渲染器以保持其透明)时,会发生此问题,但如果同时按下该键以触发方向更改,则播放器会卡在角落处,如此gif示例所示: 等待玩家卡在角落,gif需要15秒 这是我给玩家

我开始学习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中的调试日志或其他方式轻松进行测试。