[英]Unity3D - Shooting a Ray between Camera and Player - Transparent Walls
我正在尝试在相机和玩家之间拍摄一条光线,当它拍摄我的墙壁时,我的墙壁将着色器更改为透明,但出于某种原因,只有当我在墙壁的角落时它才会消失。这个想法是每次墙壁在我的播放器和相机之间它会消失。
此脚本附加到一个空的游戏对象。
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;
}
}
}
我认为问题是这一行:
Ray ray = Camera.main.ScreenPointToRay(transparentTarget);
这个函数应该在屏幕上取一个点,但你在世界空间中给它一个点。 尝试用这个替换它:
Ray ray = Camera.main.ScreenPointToRay(
new Vector3(Camera.main.pixelWidth/2, Camera.main.pixelHeight/2, 0));
这应该会给你一条从相机视图中心到玩家的光线(如果相机直接指向玩家),我认为这就是你想要的。 你也可以试试:
Ray ray = new Ray(Camera.main.transform.position,
transparentTarget - Camera.main.transform.position);
这将为您提供一条从相机指向玩家的光线。 即使玩家不在相机视图中居中,此代码仍然有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.