c# - 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);
}
}
}
我的问题是平台只向上移动了一点并且没有玩家。
解决方案
为什么平台只移动一次
平台只移动一次的原因是由于OnTriggerEnter
在进入触发器时被调用而不是停留在其中。如果您希望它在其中不断被调用,请在其中使用OnTriggerStay
或分配一个布尔值OnTriggerEnter
和OnTriggerExit
方法并更改您在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;
}
}
推荐阅读
- python - 如何打印 ndarray 完成信息?
- java - 将 XML 格式的字符串解析为 Java 对象
- mysql - OperationalError(1366,“不正确的字符串值:'\\xE2\\x80\\x8ESen...')MySQL Django
- reactjs - 当我从列表中选择新链接时,反应子功能类不会重新呈现
- android - 为什么可检查的菜单项不显示复选框
- typescript - 基于另一个对象的 arras 类型对象
- python - 多个物体在乌龟中移动?
- c# - 如何本地化 DataGridTextColumn?
- python - 如何通过pyside6通过websocket订阅binance?
- java - 如何修复 DataHandler 异常