【发布时间】:2020-12-16 01:46:30
【问题描述】:
我正在尝试在相机和播放器之间拍摄光线,当它拍摄时,我的墙会将着色器更改为透明,但由于某种原因,只有当我在墙角时它才会消失。这个想法是每次我的播放器和相机之间有一堵墙,它会消失。
此脚本附加到一个空的游戏对象。
public class WallManager : MonoBehaviour
{
[SerializeField] private string transparentTag = "Transparent";
[SerializeField] private Material transparentMaterial;
[SerializeField] private Material defaultMaterial;
public LayerMask transparencyMask;
private Transform _selection;
// Update is called once per frame
void Update()
{
Vector3 transparentTarget = GameObject.FindGameObjectsWithTag("Player")[0].transform.position;
if (_selection != null)
{
var selectionRenderer = _selection.GetComponent<Renderer>();
selectionRenderer.material = defaultMaterial;
_selection = null;
}
Ray ray = Camera.main.ScreenPointToRay(transparentTarget);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, transparencyMask))
{
var selection = hit.transform;
if (selection.CompareTag(transparentTag))
{
var selectionRenderer = selection.GetComponent<Renderer>();
if (selectionRenderer != null)
{
selectionRenderer.material = transparentMaterial;
}
_selection = selection;
}
}
}
【问题讨论】:
-
我不确定,但你有没有尝试过让光线转向?可能是飞机正常的问题。因为法线与光线的方向相同,所以会被忽略。
-
要使您的材质透明,您不应切换材质,而应更改 Alpha 或 Shader 属性。这篇文章有这两种方法的例子。 answers.unity.com/questions/1575599/…
-
我不同意@jiveturkey。更改材料属性可能会出现问题,因为通常单个材料在多个对象之间共享。因此,如果您尝试仅更改一个对象的材质属性,您最终可能会更改一堆其他对象。切换材料很好。
-
我注意到的一件事是您没有正确使用
ScreenPointToRay函数。它应该在屏幕上取一个点(即使它取一个 Vector3;它忽略了 z 坐标),但是您正在传递世界空间中的一个点。