我正在游戏中担任建筑机械师,我希望能够清除地图上的某些对象(树木,其他装饰),以便有足够的空间建造。我尝试使用射线投射来查找正在单击的对象并将其销毁,但这是行不通的。
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);
}
}
}
}
答案 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方式,因为它可以更轻松地满足您的需求,只需确保对象包含对撞机即可,我认为它们可能是触发器,并且单击仍然会发生。