unity3d - 从相机到播放器的 RayCastAll 不工作
问题描述
尝试从我的相机运行光线投射到 Z = 0,这将击中 TransparentFX 层上的对象并暂时使它们透明,因为它们可能会阻挡玩家的视野。但是光线投射永远不会击中任何东西。
ClearSight.cs
[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();
}
}
}
}
自动透明.cs
[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);
}
}
}
解决方案
弄清楚了。我使用的是 RaycastHit2D 和 Physics2D.RaycastAll,它们使用 Vector2 参数,因此 Z 前向变量被排除在方程之外。切换到 Box Collider 和 Physics.RaycastAll 效果很好。
推荐阅读
- c# - 实体框架嵌套查询 Select() 问题
- openstack - 如何登录部署在 Openstack 基础架构上的 ubuntu-cloud 实例
- sql - 如何从 Oracle LISTAGG 聚合查询的结果中消除重复值
- windows - CIS中“No One”的定义是什么,Windows系统的SID选择
- python - Tkinter + matplot 动画填充内存
- javascript - 如何使用node.js在mongodb中获取按组名分组的聚合值?
- spring - 在服务器中使用 Spring @scheduled
- javascript - 我的 req.on('end') 没有触发。如何解决这个问题?
- c# - 如何从 Excel 工作簿 C# 的内存流中访问 Date Last Saved 属性
- azure-resource-manager - 是否可以使用新的 lb 规则或使用 arm 模板的运行状况探测来更新现有的 azure 负载均衡器