首页 > 解决方案 > 使组件上的脚本仅适用于一个游戏对象?统一

问题描述

使用此脚本创建一个允许单击右键的组件,我用它来更改精灵。我已经将脚本放在几个不同的游戏对象上,但是当我右键单击一个游戏对象时,它会更改每个具有该组件的游戏对象的精灵。

如何使脚本仅适用于它所在的游戏对象,而不影响所有其他对象?谢谢!

using UnityEngine;
 using UnityEngine.UI;
 using UnityEngine.EventSystems;
 using UnityEngine.Events;
 using System.Collections;
 [ExecuteInEditMode]
 [AddComponentMenu("Event/RightButtonEvent")]
 public class RightButtonEvent : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler {
     [System.Serializable]public class RightButton : UnityEvent{}
     public RightButton onRightDown;
     public RightButton onRightUp;
     private bool isOver = false;
     void Start () {
     }
 
     void Update () {
         if (Input.GetMouseButtonDown(1)) {
             onRightDown.Invoke();
         }
         if (Input.GetMouseButtonUp(1)) {
             onRightUp.Invoke();
         }
     }
 
     public void OnPointerEnter(PointerEventData eventData) {
         isOver = true;
     }
 
     public void OnPointerExit(PointerEventData eventData) {
         isOver = false;
     }
 }

标签: c#unity3d

解决方案


你已经有了isOver标志,所以只需另外检查它Update

 void Update () 
 {
     if(!isOver) return;

     if (Input.GetMouseButtonDown(1)) {
         onRightDown.Invoke();
     }
     if (Input.GetMouseButtonUp(1)) {
         onRightUp.Invoke();
     }
 }

 public void OnPointerEnter(PointerEventData eventData) 
 {
     isOver = true;
 }

 public void OnPointerExit(PointerEventData eventData) 
 {
     isOver = false;
     // Would also do this here
     onRightUp.Invoke();
 }

而不是Update你实际上也可以实现IPointerDownHandlerand IPointerUpHandler,它们首先只在相应的对象上调用

public void OnPointerDown(PointerEventData eventData)
{
    if(eventData.button == InputButton.Right)
    {
        onRightDown.Invoke();
    }
}

public void OnPointerUp(PointerEventData eventData)
{
    if(eventData.button == InputButton.Right)
    {
        onRightUp.Invoke();
    }
}

实际上你也可以简单地使用void OnMouseDownand OnMouseUpwhich 也只在相应的对象上调用

当用户在 Collider 上方按下鼠标按钮时调用 OnMouseDown。

此事件通过 Collider 或 GUIElement 发送到 GameObject 的所有脚本。

并在那里检查按下了哪个鼠标按钮

void OnMouseDown()
{
    if(Input.MouseButtonDown(1))
    {
        onRightDown.Invoke();
    }
}

void OnMouseUp()
{
    if(Input.MouseButtonUp(1))
    {
        onRightUp.Invoke();
    }
}

推荐阅读