检测哪个GameObject触摸?

时间:2016-08-27 08:25:14

标签: c# unity3d

我有3 Game Objects。这3个游戏对象是我的正确向上向左按钮。

但是我不知道控制并检查哪些人点击了对播放器的行动!

  

注意:我可以通过为每个游戏对象创建特殊的C#来实现此目的   通过使用OnMouseDown方法,但我想在一个脚本文件中执行此操作   附加到玩家。

enter image description here

这是我的控制播放器Game Objects之一

enter image description here

1 个答案:

答案 0 :(得分:1)

  

注意:我可以通过为每个游戏对象创建特殊的C#来实现此目的   通过使用OnmouseDown方法,但我想在一个脚本文件中执行此操作   附加到玩家。

这根本不是问题。您可以让两个脚本相互通信。

方法1

当其他脚本发出点击操作时,请通知PlayerController脚本。

附加到每个GameObject以检测点击。它将点击的GameObject发送到您的PlayerController脚本。

public class ClickDetector: MonoBehaviour
{
    PlayerController playerController;

    void Start()
    {
        playerController = GameObject.Find("GameObjectPlayerControlIsAttachedTo").GetComponent<PlayerController>();
    }

    void OnMouseDown()
    {
        //Notify our PlayerController script that there was a click
        playerController.OnGameObjectClicked(this.gameObject);
    }
}

将此添加到您的PlayerController脚本中。它接收被点击的GameObject。您可以与GameObject nametag进行比较。我建议你选择tag

public class PlayerController: MonoBehaviour
{
    public void OnGameObjectClicked(GameObject objClicked)
    {
        Debug.Log("There was a click from: "+objClicked.name);
        if (objClicked.CompareTag("right"))
        {
            //Your code
        }
        else if (objClicked.CompareTag("left"))
        {
            //Your code
        }
        else if (objClicked.CompareTag("up"))
        {
            //Your code
        }
    }
}

方法2

在一个脚本(PlayerController)中执行所有操作。

您可以使用raycast。我建议你使用tag来比较点击哪个游戏对象。从编辑器创建3个标签(rightleftup),并将每个GameObject放到右侧tag。如果您不想使用代码,则可以将if (rayCastHit.collider.CompareTag("up"))替换为if (rayCastHit.collider.name=="up")

void Update()
{
    //Check if Mouse Button is pressed
    if (Input.GetMouseButtonDown(0))
    {
        //Raycast from mouse cursor pos
        RaycastHit rayCastHit;
        Ray rayCast = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(rayCast, out rayCastHit))
        {
            if (rayCastHit.collider.CompareTag("right"))
            {
                //Your code
            }
            else if (rayCastHit.collider.CompareTag("left"))
            {
                //Your code
            }
            else if (rayCastHit.collider.CompareTag("up"))
            {
                //Your code
            }
        }
    }
}

编辑

更新问题后,需要在游戏对象上附加一个碰撞器才能使用光线投射。将 Box Collider 2D 附加到3个GameObjects中的每一个。

此外,由于这是一个2D精灵,方法2 的代码会稍微改变一下:

if (Input.GetMouseButtonDown(0))
{
    Vector2 ray = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    RaycastHit2D rayHit = Physics2D.Raycast(ray, Vector2.zero);
    if (rayHit)
    {
        if (rayHit.collider.CompareTag("up"))
        {

        }
    }
}

最后,从你正在做的事情来看,你看起来需要一个Virtual JoyStick并且你当前做错了。当前的解决方案应该适合您,但正确的方法是使用UI系统(Image组件)。