首页 > 解决方案 > Unity 3D 中的移动平台

问题描述

我需要制作一个平台,当玩家进入时它会向上移动。

移动平台.cs

public class MovingPlatform : MonoBehaviour
{

    [SerializeField]
    private Vector3 newPosition;
       
    void Start()
    {
       newPosition = new Vector3(transform.position.x, transform.position.y + 5, transform.position.z);
      
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            transform.position = Vector3.MoveTowards(transform.position, newPosition, 4 * Time.deltaTime);

        }
    }
}

我的问题是平台只向上移动了一点并且没有玩家。

标签: c#unity3d

解决方案


为什么平台只移动一次

平台只移动一次的原因是由于OnTriggerEnter在进入触发器时被调用而不是停留在其中。如果您希望它在其中不断被调用,请在其中使用OnTriggerStay或分配一个布尔值OnTriggerEnterOnTriggerExit方法并更改您在Update/中的位置FixedUpdate

为什么平台在没有玩家的情况下移动

关于在没有玩家的情况下移动的平台,我假设玩家是一个物理对象,您希望他们被它推动。发生这种情况的潜在原因:

  • 你移动平台的速度太快了
  • 您正在将平台移到物理循环之外
  • 平台和/或玩家没有碰撞器(触发碰撞器不碰撞)

潜在的解决方案

它使用OnCollisionEnter而不是,OnTriggerEnter因为在这种情况下它似乎更合适(如果你要使用它,请确保有一个非触发对撞机)。

using UnityEngine;

public class MovingPlatform : MonoBehaviour
{
    [SerializeField]
    private Vector3 targetPosition = default;

    private bool touchingPlayer = false;

    private void Start()
    {
        targetPosition = new Vector3(
            transform.position.x,
            transform.position.y + 5f,
            transform.position.z);
    }

    private void FixedUpdate()
    {
        if (touchingPlayer)
        {
            transform.position = Vector3.MoveTowards(
                transform.position,
                targetPosition,
                4f * Time.fixedDeltaTime);
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Player"))
            touchingPlayer = true;
    }

    private void OnCollisionExit(Collision collision)
    {
        if (collision.gameObject.CompareTag("Player"))
            touchingPlayer = false;
    }
}

https://streamable.com/mbevlw


推荐阅读