【问题标题】:Adding force to one object adds force to all objects with script attached向一个对象添加力会向所有附加脚本的对象添加力
【发布时间】:2015-05-09 08:24:35
【问题描述】:

我编写了一个脚本,仅当鼠标在对象上时才在 y 轴上上下移动对象。我正在使用光线投射,我可以使用名称并区分每个对象。但是,当我尝试在光线投射时添加力时,所有带有脚本的对象都会移动。有谁知道这是为什么?

    using UnityEngine;
using System.Collections;

public class BlockMove : MonoBehaviour
{

    private bool dragOccuring = false;
    private Vector3 lastMousePosition = Vector2.zero;
    private float amountToMove = 0;

    // Use this for initialization
    void Start ()
    {

    }

    // Update is called once per frame
    void Update ()
    {
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
        RaycastHit hit;
        if (Input.GetMouseButtonDown (0) == true) {
            dragOccuring = true;
            if (Physics.Raycast (ray, out hit)) {
                print (hit.collider.gameObject.name);
                lastMousePosition = Input.mousePosition;

            }

        } else if (Input.GetMouseButton (0) == true) {
            ray = Camera.main.ScreenPointToRay (Input.mousePosition);

            if (Physics.Raycast (ray, out hit)) {
                print (hit.collider.gameObject.name);

                Vector3 mousePosition = Input.mousePosition;
                Rigidbody rigidbody = GetComponent<Rigidbody> ();

                if (lastMousePosition.y > mousePosition.y){
                    rigidbody.AddForce (0, -Input.mousePosition.y, 0);
                } else if (lastMousePosition.y == mousePosition.y){
                    rigidbody.AddForce (0, 0, 0);
                }
                else{
                    rigidbody.AddForce (0, Input.mousePosition.y, 0);
                }

                lastMousePosition = mousePosition;
            }
        } else if (Input.GetMouseButtonUp (0) == true) {
            dragOccuring = true;
            lastMousePosition = Vector3.zero;
        }
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您似乎忘记将光线投射命中的对象与脚本游戏对象进行比较。没有这个,当你点击屏幕上的一个对象时,所有附加了这个脚本的对象都会移动。

    尝试将您的第二个 if 块更改为类似

    } else if (Input.GetMouseButton (0) == true) {
        ray = Camera.main.ScreenPointToRay (Input.mousePosition);
    
        if (Physics.Raycast (ray, out hit)) {
            print (hit.collider.gameObject.name);
    
            // If this is the clicked object
            if(hit.collider.gameObject == gameObject){
                Vector3 mousePosition = Input.mousePosition;
                Rigidbody rigidbody = GetComponent<Rigidbody> ();
    
                if (lastMousePosition.y > mousePosition.y){
                    rigidbody.AddForce (0, -Input.mousePosition.y, 0);
                }else if (lastMousePosition.y == mousePosition.y){
                    rigidbody.AddForce (0, 0, 0);
                }else{
                    rigidbody.AddForce (0, Input.mousePosition.y, 0);
                }
            }
            lastMousePosition = mousePosition;
        }
    } else if ...
    

    您甚至可以做得更好,并在您的脚本中更早地检查这一点,这样您的函数将更快地结束未单击的对象。

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多