Unity3d 从摄影机到播放机的RayCastAll不工作
尝试从我的相机运行光线投射到Z=0,这将击中TransparentFX层上的对象,并暂时使它们透明,因为它们可能会阻挡播放器的视图。但是光线投射从来没有击中任何东西 摄像机 树 ClearSight.csUnity3d 从摄影机到播放机的RayCastAll不工作,unity3d,2d,game-physics,Unity3d,2d,Game Physics,尝试从我的相机运行光线投射到Z=0,这将击中TransparentFX层上的对象,并暂时使它们透明,因为它们可能会阻挡播放器的视图。但是光线投射从来没有击中任何东西 摄像机 树 ClearSight.cs [RequireComponent(typeof(Camera))] public class ClearSight : MonoBehaviour { [SerializeField] private LayerMask raycastLayers; // Up
[RequireComponent(typeof(Camera))]
public class ClearSight : MonoBehaviour
{
[SerializeField]
private LayerMask raycastLayers;
// Update is called once per frame
void Update()
{
Vector3 forward = transform.TransformDirection(Vector3.forward) * 10;
Debug.DrawRay(transform.position, forward, Color.green);
RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, transform.TransformDirection(Vector3.forward), 10f, raycastLayers);
if(hits != null && hits.Length > 0)
{
Debug.Log("Found objects blocking player!");
foreach(RaycastHit2D hit in hits)
{
Debug.Log("Making " + hit.transform.gameObject.name + " transparent!");
AutoTransparent at = hit.transform.GetComponent<AutoTransparent>();
if(at == null)
{
at = hit.transform.gameObject.AddComponent<AutoTransparent>();
}
at.MakeTransparent();
}
}
}
}
我明白了。我使用的是RaycastHit2D和Physics2D.RaycastAll,它使用Vector2参数,所以Z向前变量被从方程中去掉。切换到Box Collider和Physics.RaycastAll,效果很好
[RequireComponent(typeof(SpriteRenderer))]
public class AutoTransparent : MonoBehaviour
{
[SerializeField]
private SpriteRenderer[] renderTargets;
[SerializeField]
private float transparentRecoveryTime = 0.1f;
private bool isTransparent = false;
private float transparencyTimer = 0;
private void Update()
{
if (isTransparent)
{
UpdateTransparencyTimer();
}
}
private void UpdateTransparencyTimer()
{
transparencyTimer += Time.deltaTime / transparentRecoveryTime;
if(transparencyTimer >= 1)
{
MakeOpaque();
}
}
public void MakeTransparent()
{
transparencyTimer = 0;
if (!isTransparent)
{
isTransparent = true;
foreach (SpriteRenderer renderer in renderTargets)
{
Color c = renderer.color;
renderer.color = new Color(c.r, c.g, c.b, 0.3f);
}
}
}
public void MakeOpaque()
{
isTransparent = false;
foreach(SpriteRenderer renderer in renderTargets)
{
Color c = renderer.color;
renderer.color = new Color(c.r, c.g, c.b, 1);
}
}
}