如果我有以下脚本
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 时,两者都会被破坏。
我错过了什么,这适用于使用此脚本的两个组件?
答案 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);
}
}