【问题标题】:unity how can I convert transform.position into physical movement?unity 如何将 transform.position 转换为物理运动?
【发布时间】:2020-03-26 00:34:01
【问题描述】:

在我的代码中,我使用 transform.position 移动玩家,但这会在碰撞器和我的游戏物理方面产生问题。

 transform.position = new Vector3(
                transform.position.x + touch.deltaPosition.x * multiplier,
                transform.position.y,
                transform.position.z + touch.deltaPosition.y * multiplier)

如何将其转换为速度或一些物理运动,以使速度不起作用?

【问题讨论】:

  • 尝试处理刚体组件,你应该添加到游戏对象中:gameObject.GetComponent().velocity = speed;你给游戏对象一个速度,然后根据刚体物理为你处理物理。如果您在与其他物理对象的交互方面遇到问题,您可以使其具有运动性。
  • 请贴完整代码

标签: c# unity3d move


【解决方案1】:

一般来说,一旦出现Rigidbody 并且涉及到冲突,您应该避免两件事:

  • 通过transform 移动对象
  • Update 中移动对象

两者都打破了物理学。

您更愿意直接更新Rigidbody.velocity。在Update 中这样做很好

// If possible already reference via Inspector
[SerializeField] private Rigidbody _rigidbody;

private void Start()
{
    if(!_rigidbody) _rigidbody = GetComponent<Rigidbody>();
}

private void Update()
{
    ...

    _rigidbody.velocity = Vector3.right * touch.deltaPosition.x * multiplier 
        + Vector3.forward * touch.deltaPosition.y * multiplier;
    ...
}

替代方法是将用户输入 (Update) 与物理例程 (FixedUpdate) 分开并使用 MovePosition

(假设您的代码在 Update 中执行)

private Vector3 targetPosition;

// If possible already reference via Inspector
[SerializeField] private Rigidbody _rigidbody;

private void Start()
{
    if(!_rigidbody) _rigidbody = GetComponent<Rigidbody>();

    targetPosition = transform.position;
}

private void Update()
{
    ...

    targetPosition = _rigidbody.position 
        + Vector3.right * touch.deltaPosition.x * multiplier 
        + Vector3.forward * touch.deltaPosition.y * multiplier;

    ...
}

private void Update()
{
    _rigidbody.MovePosition(targetPosition);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 2022-08-19
    • 1970-01-01
    • 2012-07-18
    • 2013-05-13
    • 2011-03-18
    • 1970-01-01
    • 2014-01-19
    相关资源
    最近更新 更多