【问题标题】:Unity3D - Shooting a Ray between Camera and Player - Transparent WallsUnity3D - 在相机和播放器之间拍摄光线 - 透明墙
【发布时间】: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 坐标),但是您正在传递世界空间中的一个点。

标签: c# unity3d


【解决方案1】:

我认为问题出在这一行:

 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);

这将为您提供从相机指向播放器的光线。即使玩家不在相机视图的中心,此代码仍然有效。

【讨论】:

  • 非常感谢你,这就像一个魅力!我可能只是禁用墙壁而不是变成透明的,这样我就不会冒在墙壁透明时点击墙壁的风险。但这是一个新的问题来解决它哈哈哈。再次感谢您!
猜你喜欢
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多