「Unity/3d/透明」の版間の差分
提供: 初心者エンジニアの簡易メモ
| 行2: | 行2: | ||
以下のようなShaderを追加 | 以下のようなShaderを追加 | ||
| + | <pre> | ||
| + | Shader "Custom/SemiTransparent" | ||
| + | { | ||
| + | Properties { | ||
| + | _Color ("Color", Color) = (1,1,1,1) | ||
| + | _MainTex ("Albedo (RGB)", 2D) = "white" {} | ||
| + | } | ||
| + | SubShader { | ||
| + | Tags { "RenderType"="Transparent" "Queue"="Transparent"} | ||
| + | LOD 200 | ||
| + | |||
| + | Pass{ | ||
| + | ZWrite ON | ||
| + | ColorMask 0 | ||
| + | } | ||
| + | |||
| + | CGPROGRAM | ||
| + | #pragma surface surf Standard fullforwardshadows alpha:fade | ||
| + | #pragma target 3.0 | ||
| + | |||
| + | sampler2D _MainTex; | ||
| + | |||
| + | struct Input { | ||
| + | float2 uv_MainTex; | ||
| + | }; | ||
| − | + | fixed4 _Color; | |
| − | + | void surf (Input IN, inout SurfaceOutputStandard o) | |
| + | { | ||
| + | fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; | ||
| + | o.Albedo = c.rgb; | ||
| + | o.Metallic = 0; | ||
| + | o.Smoothness = 0; | ||
| + | o.Alpha = c.a; | ||
| + | } | ||
| + | ENDCG | ||
| + | } | ||
| + | FallBack "Diffuse" | ||
| + | } | ||
| + | </pre> | ||
| + | 参考:https://nn-hokuson.hatenablog.com/entry/2018/01/23/202530 | ||
| + | Materialを新規追加して、そのMaterialのShaderに上記"Custom/SemiTransparent"のShaderを追加 | ||
| + | ==c#のサンプル== | ||
<pre> | <pre> | ||
| − | GameObject | + | AllUnderObject(obj); |
| − | Material[] materials = | + | public void AllUnderObject(GameObject obj) |
| − | materials[0].shader = Shader.Find("Custom/SemiTransparent"); | + | { |
| − | materials[0].SetColor("_Color", new Color(1f, 1f, 1f, 0. | + | Debug.Log("name=" + obj.name); |
| + | if (obj.GetComponent<SkinnedMeshRenderer>() != null) | ||
| + | { | ||
| + | Material[] materials = obj.GetComponent<SkinnedMeshRenderer>().materials; | ||
| + | materials[0].shader = Shader.Find("Custom/SemiTransparent"); | ||
| + | materials[0].SetColor("_Color", new Color(1f, 1f, 1f, 0.8f)); | ||
| + | } | ||
| + | if (obj.GetComponent<MeshRenderer>() != null) | ||
| + | { | ||
| + | Material[] materials = obj.GetComponent<MeshRenderer>().materials; | ||
| + | materials[0].shader = Shader.Find("Custom/SemiTransparent"); | ||
| + | materials[0].SetColor("_Color", new Color(1f, 1f, 1f, 0.8f)); | ||
| + | } | ||
| + | Transform transforms = obj.GetComponentInChildren<Transform>(); | ||
| + | if (transforms.childCount > 0) | ||
| + | { | ||
| + | foreach (Transform transform in transforms) | ||
| + | { | ||
| + | AllUnderObject(transform.gameObject); // 再帰処理 | ||
| + | } | ||
| + | } | ||
| + | } | ||
</pre> | </pre> | ||
2021年11月24日 (水) 12:29時点における版
(注意:手動では透明にできたが、コードで変更ができない・・)
以下のようなShaderを追加
Shader "Custom/SemiTransparent"
{
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Transparent" "Queue"="Transparent"}
LOD 200
Pass{
ZWrite ON
ColorMask 0
}
CGPROGRAM
#pragma surface surf Standard fullforwardshadows alpha:fade
#pragma target 3.0
sampler2D _MainTex;
struct Input {
float2 uv_MainTex;
};
fixed4 _Color;
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Metallic = 0;
o.Smoothness = 0;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
参考:https://nn-hokuson.hatenablog.com/entry/2018/01/23/202530
Materialを新規追加して、そのMaterialのShaderに上記"Custom/SemiTransparent"のShaderを追加
c#のサンプル
AllUnderObject(obj);
public void AllUnderObject(GameObject obj)
{
Debug.Log("name=" + obj.name);
if (obj.GetComponent<SkinnedMeshRenderer>() != null)
{
Material[] materials = obj.GetComponent<SkinnedMeshRenderer>().materials;
materials[0].shader = Shader.Find("Custom/SemiTransparent");
materials[0].SetColor("_Color", new Color(1f, 1f, 1f, 0.8f));
}
if (obj.GetComponent<MeshRenderer>() != null)
{
Material[] materials = obj.GetComponent<MeshRenderer>().materials;
materials[0].shader = Shader.Find("Custom/SemiTransparent");
materials[0].SetColor("_Color", new Color(1f, 1f, 1f, 0.8f));
}
Transform transforms = obj.GetComponentInChildren<Transform>();
if (transforms.childCount > 0)
{
foreach (Transform transform in transforms)
{
AllUnderObject(transform.gameObject); // 再帰処理
}
}
}
