我想让玩家控制就像在“Overcooked”游戏中一样。
我目前的球员管理。
播放器控制器.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControllerTransform : MonoBehaviour {
private string moveInputAxis = "Vertical";
private string turnInputAxis = "Horizontal";
public float rotationRate = 360f;
public float moveSpeed = 1;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update ()
{
float moveAxis = Input.GetAxis (moveInputAxis);
float turnAxis = Input.GetAxis (turnInputAxis);
//Обновляет каждый кадр наше положение и поворот
ApplyInput (moveAxis, turnAxis);
}
private void ApplyInput(float moveInput, float turnInput)
{
Move (moveInput);
Turn(turnInput);
}
private void Move(float input)
{
transform.Translate (Vector3.forward*input*moveSpeed);//Можно добавить Time.DeltaTime
}
private void Turn(float input)
{
transform.Rotate (0,input * rotationRate * Time.deltaTime,0);
}
}
问题是什么。游戏里我点了(WASD),鼻子转过去就走了。(据我了解)对我来说,此刻的操控更像是操控一辆汽车。AD负责转牌。W-前进,S-后退。
因此,我想让控件类似于游戏。
ps 更多游戏视频,更好地了解游戏控制。
感谢您的关注。

一般来说,像“游戏 X 是如何做 Y”这样的问题最好向开发者自己提出。并不是因为有人“太懒惰”回答这些问题,而仅仅是因为从另一个 1v1 游戏中重现某些东西通常非常困难。
当然这可以通过另一种方式完成,但我决定经历两个阶段:
transform.forward,因为这个游戏中的角色总是只面向前方移动数据输入
这里的一切都尽可能简单,并且与问题中的选项没有区别,但我将整个事情写成一个向量,以便稍后我可以通过它获得角度和其他必要的东西:
回转
似乎可以简单地使用
但
Vector3.Angle返回向量之间的最小角度,即 从 0 到 180,当旋转从 0 到 360 的角度时,会导致以下结果:摆脱这种情况的一种方法是编写自己的函数来确定角度范围 [0..360] 的向量之间的角度:
在谷歌中很容易找到这样的功能——我不想用它的解释来加重这个问题。
然后我们将整个事情应用到
Update:我们得到了我们几乎需要的旋转:
移动
一切都几乎是基本的:它使用
Transform.Translate,不要忘记为速度添加一个变量:这段代码将不断地向其本地“直线”方向移动对象。但我们只想在用户输入时移动它。
摆脱这种情况的合乎逻辑的方法是使用向量 的模
moveVector,之前已经对其进行了归一化,以便获得 [0..1] 范围内的值:在这种情况下,您可以简单地使用模数的平方,因为模数的平方始终是
0, 或1, 和sqrt(1) == 1/-1,sqrt(0) == 0。-1出于显而易见的原因,我们并不担心。但纯粹是凭感觉——我没有测量结果,完全没有这个模块会更容易,像这样做:
值得注意的是,这种方法总是会输出一个为1的运动向量。如果游戏支持游戏手柄,其中摇杆可以在两个轴[0..1]上输出值,最好使用向量模块。
并将此方法的结果代入
Translate.最后,我们得到了这样的某种组件:
统一的结果:
附言
可以看出,物体有时会突然移动。造成这种情况的原因是物体的旋转角度发生了急剧变化,这不是一个错误,但上面代码的自然结果和没有插值的更清洁是无法做到的。
我会在你的位置做什么?
我会关注 Unity 的 Tween 引擎的方向,使用它你可以平滑整个事物并使其更自然,或者其他什么。但就我而言,目前的结果与 OverCooked 非常相似。