让一个物体检测到光线投射不再击中它
Making an object detect that raycast not hitting it anymore
我使用 SendMessage 通知被光线投射的对象:
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");
}
}
并且在每一帧打印消息 "I was hit by Ray"。
现在我需要通知游戏对象光线投射不再击中它。
@Edge 是对的,存储对命中游戏对象的引用是可行的方法。检查以下代码:
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 ;
}
}
}
我使用 SendMessage 通知被光线投射的对象:
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");
}
}
并且在每一帧打印消息 "I was hit by Ray"。 现在我需要通知游戏对象光线投射不再击中它。
@Edge 是对的,存储对命中游戏对象的引用是可行的方法。检查以下代码:
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 ;
}
}
}