我正试图为unity游戏对象构建一个控制器,以类似于normel四旋翼无人机的方式移动它。因此,无人机应该能够通过上下移动左摇杆来上升和下降,通过侧向移动左摇杆转身,并通过使用右摇杆水平移动。
我试着用unityinputSystem实现它,但不幸的是,它并没有按照预期的方式工作。运动大多不平稳,旋转会导致水平运动朝着错误的方向移动。
这是我的代码:
public void OnMove(InputValue inputValue)
{
//horizontal movement
Debug.Log(inputValue.Get());
Vector3 move = new Vector3(inputValue.Get<Vector2>().x * 10 * Time.deltaTime, 0, inputValue.Get<Vector2>().y * 1 * Time.deltaTime);
move = Quaternion.Euler(0, rotation, 0) * move;
//playerDrone.transform.position += new Vector3(inputValue.Get<Vector2>().x * 10 * Time.deltaTime, 0, inputValue.Get<Vector2>().y * 10 * Time.deltaTime);
playerDrone.transform.Translate(move, Space.World);
}
public void OnClockwiseRotation()
{
//rotation of drone clockwise
playerCam.transform.Rotate(0, 0.5f, 0, Space.World);
rotation += 0.5f;
}
public void OnCounterclockwiseRotation()
{
//rotation of drone counterclockwise
Debug.Log("Rotation");
playerCam.transform.Rotate(0, -0.5f, 0, Space.World);
rotation += 0.5f;
}
public void OnAscend1()
{
//ascend drone
playerDrone.transform.position += new Vector3(0, 0.1f, 0);
Debug.Log("Ascend");
}
public void OnDescend()
{
//descend drone
Debug.Log("Descend");
playerDrone.transform.position += new Vector3(0, -0.1f, 0);
}
有人知道为什么这场运动在实施方面存在如此大的问题吗?
提前感谢
我认为有几个错误
-
你的旋转和上升取决于帧速率。这里你没有使用
Time.deltaTime
-
在
OnClockwiseRotation
和OnCounterclockwiseRotation
中都执行rotation += 0.5f;
-
您正在使用一次
playerDrone
,另一次使用playerCam
。。你可能应该坚持一个,因为听起来你只是在旋转相机,而不是无人机。 -
一般来说,我不会将值硬编码到代码中,而是公开一些类字段,这样您就可以在不重新编译的情况下调整Inspector的速度
你可能更愿意做一些类似的事情
// Adjust these in the Inspector!
// in angle per second
public float rotationSpeed = 45;
// in meter per second
public float ascendingSpeed = 1;
public float forwardSpeed = 1;
public float sidewardsSpeed = 1;
public void OnMove(InputValue inputValue)
{
// In this case probably not a big deal but in general use getters only once
var input = inputValue.Get();
var move = new Vector3(input.x * sidewardsSpeed * Time.deltaTime, 0, input.y * forwardSpeed * Time.deltaTime);
move = Quaternion.Euler(0, rotation, 0) * move;
playerDrone.transform.Translate(move, Space.World);
}
public void OnClockwiseRotation()
{
var angle = rotationSpeed * Time.deltaTime;
playerDrone.transform.Rotate(0, angle, 0, Space.World);
rotation += angle;
}
public void OnCounterclockwiseRotation()
{
var angle = rotationSpeed * Time.deltaTime;
playerDrone.transform.Rotate(0, -angle, 0, Space.World);
rotation -= angle;
}
public void OnAscend1()
{
playerDrone.transform.position += Vector3.up * ascendingSpeed * Time.deltaTime;
}