C# Unity raycast碰撞对象并在GUI上打印其名称 使用UnityEngine; 使用系统集合; 公共类GuardSample:MonoBehavior { FOv2眼; FOV2DVisionCone visionCone; 浮动速度=-5; 雷卡斯特击中; void Start() { eyes=getComponentChildren(); visionCone=getComponentChildren(); } void FixedUpdate() { if(transform.position.x10) { 速度*=-1; } transform.position=新矢量3(transform.position.x+速度*Time.fixeddedtime,transform.position.y,transform.position.z); } bool playerView=false; 无效更新() { playerView=false; foreach(光线击中眼睛,击中) { if(hit.transform&&hit.transform.tag==“播放器”) { playerView=true; } } } void OnGUI() { 如果(播放视图) { GUI.Box(新Rect(10,10,160,60),“标题”); Label(新的Rect(10,10,160,60),hit.collider.gameObject.name); } }

C# Unity raycast碰撞对象并在GUI上打印其名称 使用UnityEngine; 使用系统集合; 公共类GuardSample:MonoBehavior { FOv2眼; FOV2DVisionCone visionCone; 浮动速度=-5; 雷卡斯特击中; void Start() { eyes=getComponentChildren(); visionCone=getComponentChildren(); } void FixedUpdate() { if(transform.position.x10) { 速度*=-1; } transform.position=新矢量3(transform.position.x+速度*Time.fixeddedtime,transform.position.y,transform.position.z); } bool playerView=false; 无效更新() { playerView=false; foreach(光线击中眼睛,击中) { if(hit.transform&&hit.transform.tag==“播放器”) { playerView=true; } } } void OnGUI() { 如果(播放视图) { GUI.Box(新Rect(10,10,160,60),“标题”); Label(新的Rect(10,10,160,60),hit.collider.gameObject.name); } },c#,unity3d,collision-detection,raycasting,identify,C#,Unity3d,Collision Detection,Raycasting,Identify,} 我的高尔德移动,当玩家进入raycast时,GUI出现,但名称无法识别 除了“hit.collider.gameObject.name”之外,其他一切都正常 Unity给出错误“对象引用未设置为对象的实例” 请看一看我是Unity和C的新手问题是您没有访问hit变量的权限,因为您没有存储它,您只是在每次迭代中保存它。一个简单的解决方案是存储命中,使playerInView=true 对Update()和OnGUI()方法的类似修改必须有效 using UnityEngine; using S

}

我的高尔德移动,当玩家进入raycast时,GUI出现,但名称无法识别

除了“hit.collider.gameObject.name”之外,其他一切都正常 Unity给出错误“对象引用未设置为对象的实例”


请看一看我是Unity和C的新手问题是您没有访问hit变量的权限,因为您没有存储它,您只是在每次迭代中保存它。一个简单的解决方案是存储命中,使
playerInView=true

对Update()和OnGUI()方法的类似修改必须有效

using UnityEngine;
using System.Collections;
public class GuardSample : MonoBehaviour 
{
FOV2DEyes eyes;
FOV2DVisionCone visionCone;
float speed = -5;
RaycastHit hit;


void Start() 
{
    eyes = GetComponentInChildren<FOV2DEyes>();
    visionCone = GetComponentInChildren<FOV2DVisionCone>();
}

void FixedUpdate()
{
    if (transform.position.x < -10 || transform.position.x > 10)
    {
        speed *= -1;
    }

    transform.position = new Vector3(transform.position.x + speed * Time.fixedDeltaTime, transform.position.y, transform.position.z);
}

bool playerInView = false;

void Update()
{
    playerInView = false;
    foreach (RaycastHit hit in eyes.hits)
    {
        if (hit.transform && hit.transform.tag == "Player")
        {
            playerInView = true;
        }
    }

}

void OnGUI()
{
    if (playerInView)
    {
        GUI.Box (new Rect (10, 10, 160, 60), "Title");
        GUI.Label( new Rect(10, 10, 160, 60), hit.collider.gameObject.name);
    }

}

不要介意问我你对我的方法有什么疑问。

看来你根本没有在执行光线投射。看看物理学,RaycasthittenGo是统一或C#或什么的默认变量?只是想知道你是受欢迎的!hittenGo只是我定义的一个变量,所以我可以用它来做任何我想要的事情。对于第二条评论,在这种情况下,你必须创建一个数组来存储所有hittenGo。使用您的代码,您只需存储最后一次命中。因此,与创建名为hittenGo的变量RayCastHit不同,您必须创建一个变量,该变量必须是RayCastHit的数组。还有一条注释,hittenGo是RayCastHit变量的名称,其中RayCastHit是Unity engine类。我建议您看看Unity教程嗨,您不是在声明数组,而是在初始化一个对象。这里有一个关于如何创建数组以及如何循环数组以获取其所有组件的示例。在这个例子中,代码展示了如何创建一个游戏对象数组并对其进行迭代。你必须用RayCastHit而不是游戏对象来做。
RaycastHit hittenGo; // Declare up this variable

void Update()
{
  playerInView = false;
  foreach (RaycastHit hit in eyes.hits)
  {
    if (hit.transform && hit.transform.tag == "Player")
    {
        hittenGo = hit;
        playerInView = true;
    }
  }
}

void OnGUI()
{
  if (playerInView)
  {
    GUI.Box (new Rect (10, 10, 160, 60), "Title");
    GUI.Label( new Rect(10, 10, 160, 60), hittenGo.collider.gameObject.name);
  }
}