单击时销毁GameObject

时间:2019-03-28 13:56:27

标签: unity3d collision-detection

我正在游戏中担任建筑机械师,我希望能够清除地图上的某些对象(树木,其他装饰),以便有足够的空间建造。我尝试使用射线投射来查找正在单击的对象并将其销毁,但这是行不通的。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectDestroy : MonoBehaviour {
    // Start is called before the first frame update
    void Start () {

    }

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

            }
        }

    }
}

2 个答案:

答案 0 :(得分:2)

这是一个小示例脚本:

public class Destroyable : MonoBehaviour
{
    private void OnMouseDown()
    {
        Destroy(gameObject);
    }
}

您可以将此脚本附加到要销毁的GameObject上,然后在“播放模式”中单击它可以销毁它。如果您只需要在游戏内编辑器中进行修改,就可以对其进行修改。

注意:您需要在同一个游戏对象上使用主动对撞机。

编辑:

以下脚本显示了更改对象颜色的示例:

public class Destroyable : MonoBehaviour
{
    public Color mouseHoverColor = Color.green;
    private Color previousColor;
    private MeshRenderer meshRenderer;

    private void Start()
    {
        meshRenderer = GetComponent<MeshRenderer>();
        previousColor = meshRenderer.material.color;
    }

    private void OnMouseDown()
    {
        Destroy(gameObject);
    }

    private void OnMouseOver()
    {
        meshRenderer.material.color = mouseHoverColor;
    }

    private void OnMouseExit()
    {
        meshRenderer.material.color = previousColor;
    }
}

答案 1 :(得分:1)

您不需要在每个对象上添加此脚本,只需将其添加到管理器中,而且我认为您缺少Raycast参数。

要查看射线方向,可以使用Debug.Ray()

此外,我更希望您使用@MSauer方式,因为它可以更轻松地满足您的需求,只需确保对象包含对撞机即可,我认为它们可能是触发器,并且单击仍然会发生。