Unity如何使用鼠标点击缩放游戏对象?

时间:2018-02-13 07:36:58

标签: c# unity3d scaling gameobject

有没有人知道如何使用鼠标点击放大不同的游戏对象,并且在进行缩放后,游戏对象不应该再次向上扩展。目前我的代码能够扩展,但它不是我想要的。 继承了我目前的代码:

public void ScaleForRuler()
{       
    transform.localScale += new Vector3 (3.0F, 0, 0.1F);

}       
void OnMouseDown()
{
    if (touch == false) 
    {
        if(ruler.GetComponent<Collider>().name == "Ruler")
        {
            ScaleForRuler ();
            touch = true;
            Debug.Log (touch);
        }
        if(TriangleThingy.GetComponent<Collider>().name == "Triangle_Set_Square_Ruler")
        {
            ScaleForTriangleThingy ();
            touch = true;
            Debug.Log (touch);
        }
         if (Tsquare.GetComponent<Collider> ().name == "Tsquare") 
        {               
            if (LineR.GetComponent<Collider> ().name == "LineRight" || LineL.GetComponent<Collider> ().name == "LineLeft") 
            {
                TsquareScaleForTB ();
                touch = true;
                Debug.Log (touch);
            } 
            else if (LineB.GetComponent<Collider> ().name == "LineBottom" || LineT.GetComponent<Collider> ().name == "LineTop") 
            {
                TsquareScaleForTB ();
                touch = true;
                Debug.Log (touch);
            }                   
        }
        if (protractor.GetComponent<Collider> ().name == "Protractor") 
        {
            ScaleForProtractor ();
            touch = true;
            Debug.Log (touch);
            Debug.Log ("protractor scale");
        }
    }
}   

2 个答案:

答案 0 :(得分:2)

停止使用OnMouseDown(),Unity已经在IPointerDownHandler类中引入了一些新的处理程序接口,如IDragHandlerEventSystem等,它与鼠标完美配合和触摸输入。

如果您希望在单击某个对象时单独缩放或只是将所有对象缩放在一起,而不管单击哪一个,那么您想要实现的目标并不是很清楚。

我假设您希望能够分别缩放所有对象。执行此操作的步骤如下:

1)将Physics 2D Raycaster组件添加到场景摄像机。

2)对于要缩放的每个对象,添加以下简单脚本:

using UnityEngine;
using UnityEngine.EventSystems;

public class ScaleExample : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {

    private Vector2 startPosition;
    private float scalingFactor = .01f;
    private bool isObjectAlreadyScaled = false;

    public void OnBeginDrag(PointerEventData eventData) {
        startPosition = Vector2.zero;
    }

    public void OnDrag(PointerEventData eventData) {
        if (!isObjectAlreadyScaled) {
            startPosition += eventData.delta;
            var scalingAmount = new Vector2(Mathf.Abs(startPosition.x), Mathf.Abs(startPosition.y));
            transform.localScale = (Vector3)scalingAmount * scalingFactor;
        }
    }

    public void OnEndDrag(PointerEventData eventData) {
        isObjectAlreadyScaled = true;
    }
}

该示例适用于2D对象(即:放大对象的X和Y),您可以非常轻松地更改此对象以适应不同的坐标缩放。 接口的使用应该是明确的:拖动开始后,OnBeginDrag被调用一次,每次指针位置发生变化时,都会重复调用OnDrag。拖动,拖动结束后立即调用OnEndDrag(即:用户释放按钮/手指)。

答案 1 :(得分:1)

在对你的问题的评论中,你写了

  

所以我想问一下,我是否只能用一个脚本来控制许多差异对象的缩放

答案是肯定的(这也是一个非常好的主意)

以下是关于如何操作的想法:

来自OnMouseDown的文件:

  

当用户在GUIElement或Collider上按下鼠标按钮时,将调用OnMouseDown。

这意味着如果您的脚本包含OnMouseDown函数:

private void OnMouseDown()
{

}

您可以将此脚本添加到多个不同的对象中。如果单击object1,则仅为object1调用该函数。如果单击object2,将为object2调用该函数。因此,您无需检查单击了哪个对象。

您的脚本应如下所示:

private void OnMouseDown()
{
    // touch is a boolean, you don't need to write touch == true, it will do it automatically
    // Also, instead of nesting all the code if touch == false, we just stop if it is true, so the code is easier to read
    if (touch)
        return; 

    touch = true;
    Debug.Log (touch);

    // transform is the transform of the object that has the script
    // you don't need any check
    transform.localScale += new Vector3 (3.0f, 0f, 0.1f);  
}   

我希望这会有所帮助

祝你好运