こちらの記事はビルド後に動作しませんでした。書き直したので下記記事を参照ください!!
リンク先PCビルドでの動作確認済み!
インスペクターからRendering Modeを変更して、半透明(透明)にする方法は出てくるのですが、プレイモード中に動的に半透明にする方法でめっちゃハマったので、シェアしたいと思います。
参考サイト
標準シェーダーのレンダリングモードをスクリプトから切り替える
https://tyfkda.github.io/blog/2018/08/29/unity-render-mode.html
↑この方には特に感謝
上記サイトでシェーダーの型を指定しないと変わらないということを知りました。
んで出来たものがこんな感じ↓
動的にインスタンスしたオブジェクトが半透明に…
スクリプトがこちら↓
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Sample : MonoBehaviour
{
Renderer rend;
// Start is called before the first frame update
void Start()
{
rend = GetComponent<Renderer>();
}
void Update()
{
if (rend != null)
{
for (int i = 0; i < rend.materials.Length; i++)
{
Material material = rend.materials[i];
//下記コードでRendering Modeが変更できるが、なくても半透明になる。
//material.SetFloat("_Mode", 2);
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;
material.SetColor("_Color", new Color(1, 1, 1, 0.5f));
}
}
}
}
いろんなサイトで、material.SetOverrideTagを使えばできるみたいなこと書いてあったんですが、必要なかったです。
んで、アセットを使用する場合、複数materialがアタッチされている場合があったので、for使ってます。必要ないなら消してね。
MeshRendereやSkinnMeshRendererもRendererだけ取得すれば動いた。(継承しているみたい)
最初、インスペクターでRengering Modeを変更して半透明にできるんなら、動的にRengering Modeを変更して半透明できると思ってたんですが、Rengering Modeを変更して、透明度を変更しても意味なかった。。
ちなみに、material.SetFloat(“_Mode”, 2)の数字部分は
0=Opaque
1=Cutout
2=Fade
3=Transparent
になっている模様。
これで、マイクラみたいにオブジェクトを生成する場合の、設置先に半透明サンプル的なやつができた。
生成位置や角度は要調整だが…
コメント