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
Unity3d 统一:对角线运动问题_Unity3d_Unity5_Unity3d 2dtools - Fatal编程技术网

Unity3d 统一:对角线运动问题

Unity3d 统一:对角线运动问题,unity3d,unity5,unity3d-2dtools,Unity3d,Unity5,Unity3d 2dtools,我有一个测试2D游戏,我的玩家从左向右移动,当他到达屏幕的尽头时,它会在另一边变换。我改变了主意,让我的球员沿对角线移动。它确实起作用了,但我不知道如何让播放器在触屏时停止。我不想让它在另一边发生变化,而是停下来。到目前为止,我所有的结果要么是边缘出现了一些小故障,要么根本就没有停止。我已经提供了我的PlayerController脚本。现在我的球员沿对角线移动,他将在屏幕边缘后继续。如果有人能帮助我,我将非常感激。我从来没有想过我会处理对角线运动,但我真的想学习如何做 使用系统集合; 使用Sy

我有一个测试2D游戏,我的玩家从左向右移动,当他到达屏幕的尽头时,它会在另一边变换。我改变了主意,让我的球员沿对角线移动。它确实起作用了,但我不知道如何让播放器在触屏时停止。我不想让它在另一边发生变化,而是停下来。到目前为止,我所有的结果要么是边缘出现了一些小故障,要么根本就没有停止。我已经提供了我的PlayerController脚本。现在我的球员沿对角线移动,他将在屏幕边缘后继续。如果有人能帮助我,我将非常感激。我从来没有想过我会处理对角线运动,但我真的想学习如何做

使用系统集合; 使用System.Collections.Generic; 使用UnityEngine; 使用UnityEngine.UI; 公共类玩家控制器:单行为{ 公共浮动速度=7; 公共交通流量=7; 公共事件系统。玩家死亡行动; 浮动屏幕半宽度单位; 刚体2d rb; 无效启动{ rb=GetComponent; float halfPlayerWidth=transform.localScale.x/2f; screenHalfWidthInWorldUnits=Camera.main.aspect*Camera.main.orthographicSize; } 无效更新 { float inputX=Input.GetAxisRawHorizontal; 浮动速度=输入x*速度; transform.TranslateVector2.right*速度*时间.deltaTime; } 公共无效动产权 { rb.velocity=新矢量2速度,快速; } 公共空间左移 { rb.velocity=新矢量2速度,-快速; } 公共停车场 { rb.速度=矢量2.0; } 无效OnTiggerInter2dCollizer2D触发器碰撞器 { 如果triggerCollider.tag==框 { 如果OnPlayerDeath!=null { OnPlayerDeath; } 破坏游戏对象; } } }
您可以检查玩家是否在您定义的地图边界处

如果分别为x轴和y轴选中此项,则可以将其x轴或y轴锁定到边界,而不是更远

下面是我之前制作的一个脚本的示例

如果我理解正确,您希望能够沿对角线移动。在我下面的示例脚本中,您可以沿直线和对角线移动,也可以在边之间扭曲或在边处停止,正如您所说的那样

这个脚本可能比您需要的要高级一点,所以如果有什么让您困惑的地方,请告诉我

请注意,如果您将布尔值_ShouldWarp设置为false,他将在边界处停止,否则他将从地图的边到边扭曲

使用系统集合; 使用System.Collections.Generic; 使用UnityEngine; 公共类玩家:单一行为 { 公共浮子_速度=5f; 公共世界边界(public WorldBounds);; public bool _ShouldWarp;//如果_ShouldWarp为false,将阻止玩家移动。 无效更新 { 移动 战地边界; } 无效移动 { float horizontal=Input.GetAxisRawHorizontal; float vertical=Input.GetAxisRawVertical; transform.TranslateVector3.right*Time.deltaTime*_Speed*水平; transform.TranslateVector3.up*Time.deltaTime*_Speed*vertical; } 虚空翘曲边界 { //X轴 //如果玩家在正X边界 如果transform.position.x>\u WorldBounds.xPlus+\u WorldBounds.xBuffer { 如果_ShouldWarp//Teleport/warp player设置为启用 { transform.position=new Vector3_WorldBounds.xMinus,transform.position.y,transform.position.z; } 否则//否则将玩家保持在边界位置 { transform.position=newvector3_WorldBounds.xPlus+_WorldBounds.xBuffer,transform.position.y,transform.position.z; } } //否则,如果玩家处于负X边界 如果transform.position.x<_WorldBounds.xMinus-_WorldBounds.xBuffer { 如果_ShouldWarp//Teleport/warp player设置为启用 { transform.position=newvector3_worldbunds.xPlus,transform.position.y,transform.position.z; } 否则//否则将玩家保持在边界位置 { transform.position=new Vector3_WorldBounds.xMinus-_WorldBounds.xBuffer,transform.position.y,transform.position.z; } } //Y轴 //如果游戏者在正Y边界 如果transform.position.y>\u WorldBounds.yPlus+\u WorldBounds.yBuffer { 如果_ShouldWarp//Teleport/warp player设置为启用 { transform.position=新向量3 transform.position.x,_WorldBounds.yMinus,transform.position.z; } else//否则将玩家保留在 边界位置 { transform.position=新向量3 transform.position.x,_WorldBounds.yPlus+_WorldBounds.yBuffer,transform.position.z; } } //否则,如果玩家处于负Y边界 如果transform.position.y<_WorldBounds.yMinus-_WorldBounds.yBuffer { 如果_ShouldWarp//Teleport/warp player设置为启用 { transform.position=新向量3 transform.position.x,_WorldBounds.yPlus,transform.position.z; } 否则//否则将玩家保持在边界位置 { transform.position=新向量3 transform.position.x,_WorldBounds.yMinus-_WorldBounds.yBuffer,transform.position.z; } } } } //设置为可序列化,以便在Unity的inspector窗口中正确显示。 [系统可序列化] 公共阶级界 { [头部边界] 公共浮点数xMinus=-9.4f; 公共浮点数xPlus=9.4f; 公共浮动yMinus=-9.4f; 公共浮点数yPlus=9.4f; [头部缓冲区] 公共浮点数xBuffer=1f; 公共浮点数yBuffer=1f; } 编辑:

通过您的添加,我将能够将移动分配给我的两个按钮。一个是上和右,另一个是下和左

这应该可以沿对角线左右移动

我所做的更改是将水平输入用于X和Y移动

我不需要翘曲。只是为了在定义的边界上迈出一步


您可以将扭曲布尔值设置为false或从代码中删除扭曲部分,然后:-,应该可以工作。

您想在到达边缘时销毁玩家吗?为什么不在您想限制玩家的位置创建碰撞器?@MGDroid不,我只想让他停下来。当它在左边或右边时效果很好,但是在对角线上,我遗漏了一些东西。快速问,为什么你要用变换移动玩家。用平移代替你的方法MoveRight和MoveLeft?目前,这将忽略物理对象,如对撞机。是否可以添加一个有关情况和问题的简短视频/gif?我有点难以想象正在发生什么。在我尝试实现它之前唯一的事情就是。通过您的添加,我将能够将移动分配给我的两个按钮。一个是上和右,另一个是下和左。这只是一个一般性的问题,因为我很有能力把事情搞砸。从我看来。我不需要翘曲。只需在定义的边界上迈出一步。我不知道怎么做,但我会努力的。在我的x和y位置上添加边界。也只是要注意一下。我不想让它直线移动。右上对角线和左下对角线。请看我刚刚对原始答案底部所做的编辑,在这里我试图解决你所问的问题。两个小问题。我不知道如何将移动功能分配给inspector中的上/右和下/左两个按钮。现在它可以和键盘一起工作。第二,你能给我一个关于缩放边界的提示吗?现在我的玩家确实击中了边界,但是它太大了,如果我改变了缓冲区或边界上的某些东西,我的玩家的繁殖位置就会移动,因此我永远无法正确调整边界。非常感谢。我在代码中使用的输入是Unity的输入系统,在本例中称为水平轴。这通常可以通过A和D按钮或左右箭头键进行控制。关于输入的文档页面:要缩放边框,请将玩家移动到靠近边框的位置,查看他的坐标,然后将该坐标应用于Bounds变量。不确定你所说的繁殖位置改变是什么意思,它不应该对繁殖位置产生影响。
        void Move()
    {
        float horizontal = Input.GetAxisRaw("Horizontal");
        transform.Translate(Vector3.right * Time.deltaTime * _Speed * horizontal);
        transform.Translate(Vector3.up * Time.deltaTime * _Speed * horizontal);
    }