销毁gameobject会删除脚本附加到的所有对象

时间:2018-02-16 21:35:16

标签: unity3d

如果我有以下脚本

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

public class Pickup : MonoBehaviour
{
    public RaycastHit Hit;
    public string PickupMessage = "none";

    private bool canHover;

    void Awake()
    {
        Debug.Log("This script is for " + gameObject.name);
    }

    void Update()
    {
        Camera camera = Camera.main;
        Ray ray = camera.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out Hit))
        {
            if (Hit.distance <= 1.5f && gameObject.tag == "pickup")
            {
                canHover = true;
                pickUpItem();
            }
            else
            {
                canHover = false;
            }
        }
    }

    void OnGUI()
    {
        if(canHover == true)
        {
            GUI.Box(new Rect((Screen.width / 2) - 100, (Screen.height / 2) - 100, 150, 20), PickupMessage.ToString());
        }
    }

    private void pickUpItem()
    {
        if(Input.GetKeyDown("f"))
        {
            Destroy(gameObject);
        }
    }
}

我将此脚本链接到两个组件(Key和Keyhole)

是的,当我接近其中任何一个时,它会显示两个消息,类似当我在其中一个附近点击 F 时,两者都会被破坏。

我错过了什么,这适用于使用此脚本的两个组件?

1 个答案:

答案 0 :(得分:0)

这里的问题是每个脚本都在投射自己的光线。因此,它们都在同一点进行转换,检测对象,并使if语句成立。脚本中的光线并不关心对象是什么,因为它们只是在寻找正确标记并且在范围内的任何对象,而不是脚本附加到的对象。

您应该做的是在单独的对象中处理光线投射,以便您只投射单个光线进行物体检测。

在单独的脚本中,您仍然可以与唯一的游戏对象进行交互,因为对撞机信息存储在命中组件中。

if (Physics.Raycast(ray, out Hit))
{
    if (Hit.distance <= 1.5f && gameObject.tag == "pickup")
    {
        print(Hit.collider.gameObject.tag);
        Destroy(Hit.collider.gameObject);
    }
}