【问题标题】:Destroy GameObject when its clicked on单击时销毁游戏对象
【发布时间】:2019-03-28 13:56:26
【问题描述】:

我正在我的游戏中制作建筑机制,我希望能够清除地图周围的某些物体(树木、其他装饰),这样我就有了建造空间。我尝试使用光线投射来查找正在单击的对象并销毁它,但这不起作用。

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);

            }
        }

    }
}

【问题讨论】:

  • 确保您已将 3D 对撞机附加到游戏对象。
  • @Iggy 一切都有对撞机
  • 您是否已经测试过 onMouseDown() 方法?如果您在对象上有一个碰撞器并附加了脚本,这也应该通过在 onMouseDown() 方法中调用 Destroy() 来工作。
  • " if (hit.collider.gameObject == gameObject) 销毁 (gameObject);"将检查具有此代码的对象是否与被单击的对象相同,这真的是您想要的吗?

标签: unity3d collision-detection


【解决方案1】:

这是一个小示例脚本:

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

您可以将此脚本附加到您要销毁的游戏对象上,然后在播放模式期间您可以单击它来销毁它。如果您只需要在游戏内编辑器中使用它,它是可以修改的。

注意:您需要在同一个 Gameobject 上使用一个活动的 Collider。

编辑:

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

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;
    }
}

【讨论】:

  • 另请注意,对象应该有一个collider 才能工作。
  • @AliKanat:编辑了我的答案。刚刚回答了具体问题,从上面的评论中建议对撞机已经存在,并且忘记在一般情况下说得足够清楚。所以谢谢你的提示!
  • @MSauer 有效,但有没有办法在游戏中选择对象(用鼠标悬停在它上面),当你按下某个键时它会被破坏?
  • 对于您的最后一条评论,请使用我的解决方案,创建一个持续进行光线投射的脚本,然后突出显示检测到的脚本。
  • @Cri:是的,您可以使用 OnMouseOver() 和 OnMouseExit()。您还需要一个对撞机,在您的情况下,它已经附加,然后您可以处理您在其中的行为。此链接下有一个着色示例(docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseOver.html)。
【解决方案2】:

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

要查看你的光线要去哪里,你可以使用Debug.Ray()

另外,我希望你使用@MSauer 方式,因为它更符合你的要求,只要确保对象包含对撞机,我认为它们可以是触发器并且点击仍然会发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2012-12-06
    • 2015-08-30
    相关资源
    最近更新 更多