【问题标题】:Moving child GameObject inside moving parent GameObject在移动父游戏对象内移动子游戏对象
【发布时间】:2019-09-29 09:05:51
【问题描述】:

我正在尝试制作一个 2.5D SHMUP 类型的游戏,在该游戏中,世界不断向前移动,而玩家的飞船和相机保持原位。这意味着即使世界在移动,如果玩家的船在屏幕中间,它也会停留在那里。

为此,我创建了一个名为 Moving World 的空游戏对象,并将以下脚本附加到它:

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 观看游戏的实际运行)。请注意,在 video gamemaker 中用于实现效果,而我正在尝试仅使用代码来实现类似的效果。

【问题讨论】:

  • 你的父母有刚体吗?
  • localPosition
  • @Menyus 否。父级没有刚体,因为它不需要使用物理引擎。
  • 是否有理由让相机和宇宙飞船成为背景/障碍物的孩子?只要让相机和宇宙飞船成为世界其他地方的兄弟姐妹。
  • 即使在Unity官方shmup tutorial中,相机和玩家都是顶级游戏对象...

标签: c# unity3d


【解决方案1】:

我通过执行以下操作达到了我想要的效果。首先,我删除了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);
    }
}

两个重要说明:

  • 引入了shipVelocity 变量以确保船继续以相机速度巡航。
  • 即使相机不是刚体,它的位置更新也必须在FixedUpdate 方法期间进行,以确保它与船在同一帧上移动。使用Update 方法更新它会由于去同步而导致船舶抖动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    相关资源
    最近更新 更多