【问题标题】:Making an object detect that raycast not hitting it anymore让一个物体检测到光线投射不再击中它
【发布时间】:2017-08-31 23:59:02
【问题描述】:

我使用 SendMessage 来通知被 Raycast 击中的对象:

     using UnityEngine;

 public class Raycaster : MonoBehaviour {
     void Update() {
         RaycastHit hit;
         if (Physics.Raycast(transform.position, transform.forward, out hit))
          if(hit.transform.tag == "MyGameObject"){
            hit.transform.SendMessage ("HitByRay");
            }  
     }
 }

对象有这样的脚本:

using UnityEngine;

 public class ObjectHit : MonoBehaviour {
     void HitByRay () {
         Debug.Log ("I was hit by a Ray");
     }
 }

每帧都显示“我被雷击中”的打印消息。 现在我需要通知那个游戏对象,光线投射不再击中它了。

【问题讨论】:

  • 存储对上次命中对象的引用,如果新对象 != 最后一个对象,或者这次光线投射没有命中任何东西,则告诉该对象它不再被命中。

标签: c# unity3d google-cardboard


【解决方案1】:

@Eddge 是对的,存储对命中游戏对象的引用是可行的方法。检查以下代码:

public class Raycaster : MonoBehaviour
 {
     private bool hitting = false;
     private GameObject hitObject;

     void Update()
     {
         RaycastHit hit;
         if (Physics.Raycast(transform.position, transform.forward, out hit))
         {
            if(hit.transform.tag == "MyGameObject")
            {
                GameObject go = hit.transform.gameobject ;

                // If no registred hitobject => Entering
                if( hitObject == null )
                {
                    go.SendMessage ("OnHitEnter"); 
                }
                // If hit object is the same as the registered one => Stay
                else if( hitObject.GetInstanceID() == go.GetInstanceID() )
                {
                    hitObject.SendMessage( "OnHitStay" );
                }
                // If new object hit => Exit last + Enter new
                else
                {
                    hitObject.SendMessage( "OnHitExit" );
                    go.SendMessage ("OnHitEnter");
                }

                hitting = true ;
                hitObject = go ;
            } 
         }
         // No object hit => Exit last one
         else if( hitting )
         {
            hitObject.SendMessage( "OnHitExit" );
            hitting = false ;
            hitObject = null ;
         }
     }
 }

【讨论】:

  • 谢谢,太棒了。但是我可以用 WHILE 循环以某种方式做到这一点,我认为它需要更少的代码吗?例如向对象“Hit”发送消息并将脚本放在该对象上,例如,while(我收到消息“Hit”){做某事}
  • 我认为它不需要更少的代码。我建议使用OnHitEnterOnHitStayOnHitExit这3个函数,以便灵活。您只需在附加到光线投射的可能目标的脚本中实现给定的功能。如果需要,您可以在目标对象上设置一个变量 hit,在 OnHitEnter 中设置为 true,在 OnHitExit 中设置为 false,然后在 Update 函数中设置以下条件 @987654331 @
  • 我知道这是一篇旧帖子,但您帮助我解决了一个我花了将近三天时间试图解决的问题(我是 C 编程新手)。非常感谢:D
猜你喜欢
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2016-03-17
  • 2022-01-09
相关资源
最近更新 更多