我有一个光线投射,然而它会通过它想象的敌人,但它没有其他任何东西。如果我移除面具,它会击中敌人层。如果我删除图层并使用raycastall它只会击中敌人。
如果我使用光线投射,它会通过墙壁清晰并击中播放器,但不会显示为点击,实际上我会收到错误
NullReferenceException: Object reference not set to an instance of an object
EnemyAI.OnTriggerEnter2D (UnityEngine.Collider2D other) (at Assets/Scripts/EnemyAI.cs:32)
第32行是Debug.Log(hit.transform.gameObject);.如果我删除它,根本没有任何事情发生。没有错误,没有命中。
Heres是代码
void OnTriggerEnter2D(Collider2D other){
if (other.gameObject.tag == "Player") {
myStats.inRange = true;
Vector2 direction = other.transform.position - transform.position;
hit = Physics2D.Raycast(transform.position, direction, myCircle.radius + 1, LayerMask.GetMask("enemies"));
Debug.Log("Radius size is " + (int)myCircle.radius);
Debug.Log("donthit value " + LayerMask.GetMask("Enemies"));
Debug.Log("direction " + (myStats.player.transform.position - transform.position));
Debug.DrawRay(transform.position, other.transform.position - transform.position, Color.white);
Debug.DrawLine(transform.position, myStats.player.transform.position, Color.white);
//Destroy(hit.transform.gameObject);
Debug.Log (hit.transform.gameObject);
if(hit != null && hit.transform.gameObject != null){
if (hit.transform.gameObject.tag == "INDESTRUCTIBLE") {
Debug.Log("WALL");
// Destroy the Tag "Enemy" here
}
if (hit.transform.gameObject.tag == "Player") {
Debug.Log("player");
// Destroy the Tag "Enemy" here
}
Debug.Log("Tag name is " + hit.collider.tag);
}
Debug.DrawRay(transform.position, myStats.player.transform.position - transform.position, Color.white);
}
}
答案 0 :(得分:1)
所以看来这里有两件事情在起作用。首先,根据the documentation,Raycast 2D还将检测射线开始处的对撞机。如果你不使用raycastAll那么源敌人会在你的光线进入世界之前停止它。为了防止这种情况,您可以使用图层蒙版。可以肯定的是,图层蒙版表示您想要点击的图层,而不是您要忽略的图层。因此,为了确保敌人图层是您忽略的唯一图层,您可以使用它:
var layerMask = Physics2D.DefaultRaycastLayers & ~LayerMask.GetMask("Enemies");
然后在你的光线投射中使用这个掩码。
其次,必须有一个原因,你没有打其他任何东西。如果您以错误的方式应用了图层蒙版,则可以过滤掉墙壁或播放器上的所有点击。看起来你们都有敌人的标签和敌人的一层,所以一定要直截了当。但是如果你使用没有面具的raycastAll并且仍然没有击中任何东西,那么请确保你的对象满足所有要求。他们当然必须有2D对撞机。如果他们有碰撞器,请确保它们不是触发器,或者在编辑 - >中启用了“Raycasts命中触发器”。项目设置 - > physics2d。
最后要检查的是你的光线是否足够远。我注意到你的调试绘图并不能完美地反映你的光线投射。用它来绘制实际的光线:
Debug.DrawLine(transform.position, transform.position + direction * (myCircle.radius + 1) / direction.magnitude, Color.white);