【问题标题】:rigidbody.AddForce affects all game objects with the same script component刚体.AddForce 影响具有相同脚本组件的所有游戏对象
【发布时间】:2014-08-08 18:05:46
【问题描述】:

在场景中,我有 3 个球,每个球都附有 Ball.cs 脚本。当我用鼠标推球时,所有的球都开始移动,但我只需要我触摸的那个移动。

这是我的固定更新:

void FixedUpdate() {
    if(!isMoving) {

        if (Input.GetMouseButtonDown (0)) {

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, 100)) {
                if(hit.collider.tag == "Ball") {
                    startPos = hit.point;
                }
            }
        }

        if (startPos != Vector3.zero && Input.GetMouseButtonUp(0)) {
            endPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

            Vector3 direction = endPos - startPos;
            direction.Normalize();

            float distance = Vector3.Distance(endPos, startPos);

            rigidbody.AddForce(direction * distance * force * Time.deltaTime, ForceMode.Impulse);

            isMoving = true;
        }
    } else {
        if(rigidbody.velocity.sqrMagnitude == 0) {
            isMoving = false;
            startPos = endPos = Vector3.zero;
        }
    }
}

【问题讨论】:

  • 不要比较对撞机标签。将碰撞器与此实例的碰撞器进行比较。

标签: c# unity3d rigid-bodies


【解决方案1】:

就像Nick Udell 已经提到的那样,您对标签的比较是问题的根源。所有三个球几乎同时执行相同的脚本。因此,如果您单击球,所有三个脚本都会在鼠标位置投射光线并检查它们是否击中球。你猜怎么了?他们都击中了一个球,但没有击中他们所属的球。

您需要检查他们是否正在撞击附加到他们的游戏对象的对撞机

if (hit.collider == collider) {
    // do stuff
}

【讨论】:

  • 谢谢你们。现在它可以按我的意愿工作,但我意识到更复杂的代码变得更难管理。我想我需要一些游戏管理器
猜你喜欢
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多