Unity踩过的大坑

本篇文章是记录我本次使用unity在模型上打洞时踩过的坑,主要是我初始Unity,对其功能和设置不熟悉。主要有一下几个问题:

  1. 实现模型透视和非透视切换
  2. 鼠标点击,通过射线击中模型,编辑器game中能够获取击中点所在贴图的坐标,导出exe后获取坐标为0

(一)实现模型透视和非透视切换

通过点击toggle按钮,绑定相应的响应函数,实现透视和非透视的转换

toggle.onValueChanged.AddListener((bool isOn) => { onToggle(isOn); });

//透视按钮相应函数
private void onToggle(bool isOn)
{
    float a = 0;
    if (isOn)
    {
        a = 0;
        //这里我首先对其材质球进行模式转换,当选中时转换为透视Transparent
        Material material = m_Object.GetComponent<MeshRenderer>().materials[0];
        SetMaterialRenderingMode(material, RenderingMode.Transparent);
    }
    else
    {
        a = 1;
        //当没选中时转换为透视Transparent
        Material material = m_Object.GetComponent<MeshRenderer>().materials[0];
        SetMaterialRenderingMode(material, RenderingMode.Cutout);
    }

    Color color;
    color = m_Object.GetComponent<MeshRenderer>().materials[0].color;
    color.a = a;
    m_Object.GetComponent<MeshRenderer>().materials[0].color = color;
}

//下面是从网上档的一个模式转换函数,非常感谢作者
public static void SetMaterialRenderingMode(Material material, RenderingMode renderingMode)
{
    switch (renderingMode)
    {
        case RenderingMode.Opaque:
                material.SetFloat("_Mode",0.0f);
                material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
                material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
                material.SetInt("_ZWrite", 1);
                material.DisableKeyword("_ALPHATEST_ON");
                material.DisableKeyword("_ALPHABLEND_ON");
                material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                material.renderQueue = -1;
                break;
        case RenderingMode.Cutout:
                material.SetFloat("_Mode", 1.0f);
                material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
                material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
                material.SetInt("_ZWrite", 1);
                material.EnableKeyword("_ALPHATEST_ON");
                material.DisableKeyword("_ALPHABLEND_ON");
                material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                material.renderQueue = 2450;
                break;
       case RenderingMode.Fade:
                material.SetFloat("_Mode", 2.0f);
                material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
                material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
                material.SetInt("_ZWrite", 0);
                material.DisableKeyword("_ALPHATEST_ON");
                material.EnableKeyword("_ALPHABLEND_ON");
                material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
                material.renderQueue = 3000;
                break;
        case RenderingMode.Transparent:
                material.SetFloat("_Mode", 3.0f);
                material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
                material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
                material.SetInt("_ZWrite", 0);
                material.DisableKeyword("_ALPHATEST_ON");
                material.DisableKeyword("_ALPHABLEND_ON");
                material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
                material.renderQueue = 3000;
                break;
    }
}

通过上述代码实现透视非透视转换,其在编辑器中运行良好,但是导出到exe后,不报错,但是无法实现透视效果。

解决方案:

(1)在【Edit】=>【project settings】=>【Graphics】下添加shader信息【Standard】,如果不设置,导出exe时Unity不会自动将其封装。

(2)添加后再执行导出exe操作,这可能需要消耗一段时间,大概3~5min左右,这样导出后的exe就可以实现透视了。

(二)鼠标点击,通过射线击中模型,编辑器game中能够获取击中点所在贴图的坐标,导出exe后获取坐标为0

解决方案:

(1)给模型添加【Mesh Collider】 

(2)设置模型的导入,勾选【Read/Write Enabled】。

 注意:如果射线通过hit.textureCoord获取不到UV坐标,一定要检查模型是否勾选了勾选【Read/Write Enabled】。我就是因为没有勾选,导致浪费了两天时间!!!!!!!!!!(叹号表示愤慨)。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥羊汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值