本篇文章是记录我本次使用unity在模型上打洞时踩过的坑,主要是我初始Unity,对其功能和设置不熟悉。主要有一下几个问题:
- 实现模型透视和非透视切换
- 鼠标点击,通过射线击中模型,编辑器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】。我就是因为没有勾选,导致浪费了两天时间!!!!!!!!!!(叹号表示愤慨)。