我正试图制作一个2.5D的闪影式游戏,在这个游戏中,玩家的宇宙飞船和相机停留在原地,世界继续向前移动。这意味着,即使世界在移动,如果玩家的飞船在屏幕中央,它也会停留在那里。
为此,我创建了一个名为“移动世界”的空游戏对象,并附加了以下脚本:
public class movingWorldController : MonoBehaviour
{
private float movementSpeed = 5f;
void Update()
{
transform.position = transform.position + new Vector3(0, 0, movementSpeed * Time.deltaTime);
}
}然后我把相机和宇宙飞船作为孩子加入到这个物体中,结果,它们确实和这个移动的世界物体一起移动。然而,我也有一个脚本附加到飞船上,允许它根据玩家的输入移动,如果我启用上面的脚本,飞船将停止响应玩家的输入。这艘船的剧本是这样的:
public class ShipController : MonoBehaviour
{
public Rigidbody rb;
public float moveSpeed = 5f;
private Vector3 movement;
void Update()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.z = Input.GetAxisRaw("Vertical");
}
private void FixedUpdate()
{
rb.MovePosition(rb.position + movement * moveSpeed * Time.deltaTime);
}
}当世界移动脚本被禁用时,船舶控制器工作得很好,所以我怀疑世界脚本是在某种程度上覆盖了宇宙飞船的位置。我该怎么解决这个问题?
有关POC示例,请参阅此视频:https://www.youtube.com/watch?v=-fVjWgfUKn4&t=282s (跳转到4:00查看游戏中的动作)。请注意,在视频游戏制造者是用来实现的效果,而我试图达到一个类似的效果使用的只是代码。
发布于 2019-10-02 08:10:53
我通过做以下事情达到了我想要达到的效果。首先,我删除了MovingWorld对象,并将以下脚本应用于摄像机:
public class movingWorldController : MonoBehaviour
{
public float movementSpeed = 5f;
void FixedUpdate()
{
transform.position = transform.position + new Vector3(0, 0, movementSpeed * Time.deltaTime);
}
}这将使相机不断向前移动。接下来,为了确保玩家的飞船与摄像机保持一致,并且同时具有可操作性,我将以下脚本应用于飞船的对象:
public class ShipController : MonoBehaviour
{
public Rigidbody rb;
private float shipVelocity = 5f;
public float moveSpeed = 10f;
private Vector3 movement;
void Update()
{
movement.x = Input.GetAxisRaw("Horizontal") * moveSpeed;
movement.z = Input.GetAxisRaw("Vertical") * moveSpeed + shipVelocity;
}
private void FixedUpdate()
{
rb.MovePosition(rb.position + movement * Time.deltaTime);
}
}两个重要的注意事项:
camera-speed.
shipVelocity变量FixedUpdate方法中必须进行位置更新,以确保它在与船舶相同的帧上移动。使用de-synchronization.方法更新它将给船舶带来抖动。
https://stackoverflow.com/questions/58153808
复制相似问题