? 俗話說久病成醫(yī),雖然不是專業(yè)技術(shù)美術(shù),但代碼寫久了自然會積累一些常用的shader交互方法。零零散散的,總結(jié)如下:
1,改變UGUI的材質(zhì)球?qū)傩?/h3>
? 有時候我們需要改變ui的一些屬性,從而實(shí)現(xiàn)想要的效果。通常UGUI上有如下屬性,而我們想要改變,就需要獲取到Material這個屬性:
? 這里拿Image來舉例,?簡單的調(diào)用示例如下(關(guān)聯(lián)測試):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 測試UI閃白效果
/// </summary>
public class TestUIShan : MonoBehaviour
{
public Image image;
public Material material;
private bool isShan = false;
// Start is called before the first frame update
void Start()
{
material = image.material;
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
isShan = !isShan;
material.SetFloat("_Switch", isShan ? 1 : 0);
}
}
}
? 我們可以通過代碼看出,我們可以直接獲取到面板上的Material屬性,然后通過SetFloat之類的Set方法,來改變UGUI的材質(zhì)球?qū)傩浴?/p>
2,改變物體的材質(zhì)球?qū)傩?/h3>
? 這里多了一步,不是直接改變Material,而是先new一個MaterialPropertyBlock然后再將其賦值給Renderer屬性。實(shí)現(xiàn)示例代碼如下:
/// <summary>
/// 改變子物體顏色
/// </summary>
public void ChangeColor(Transform _tran, bool _isHas)
{
var _render = _tran.GetComponent<MeshRenderer>();
if (_render != null)
{
var _pro = new MaterialPropertyBlock();
_pro.SetFloat("_IsEnable", _isHas ? 0 : 1);
_render.SetPropertyBlock(_pro);
}
var _render1 = _tran.GetComponent<SkinnedMeshRenderer>();
if (_render1 != null)
{
var _pro = new MaterialPropertyBlock();
_pro.SetFloat("_IsEnable", _isHas ? 0 : 1);
_render1.SetPropertyBlock(_pro);
}
if (_tran.childCount > 0) foreach (Transform idx in _tran) ChangeColor(idx, _isHas);
}
? 這里是通過SetFloat來控制_IsEnable這個屬性的開關(guān),同理我們可以調(diào)用別的set方法來改變對應(yīng)的屬性。
3,替換shader
? 這個就更簡單了,只需要得到Material的shader屬性并替換即可,示例代碼如下:
/// <summary>
/// 替換shader
/// </summary>
public void ChangeShader(Transform _tran, Shader _s)
{
if (_tran.name.Contains("diban") || _tran.name.Contains("qiang")) return;//0511佳琪定
var _render = _tran.GetComponentInChildren<MeshRenderer>();
if (_render != null)
{
_render.material.shader = _s;
}
var _render1 = _tran.GetComponentInChildren<SkinnedMeshRenderer>();
if (_render1 != null)
{
_render1.material.shader = _s;
}
if (_tran.childCount > 0) foreach (Transform idx in _tran) ChangeShader(idx, _s);
}
? 關(guān)鍵函數(shù)為? _render1.material.shader = _s; 直接賦值替換即可。
4,批量獲取父節(jié)點(diǎn)下,所有具有某一屬性的物體
? 其實(shí)通過2/3函數(shù),我們可以看出用遞歸去獲取父物體下所有具有renderer屬性物體的方法,實(shí)現(xiàn)起來實(shí)在太繁瑣了,那么有沒有更簡單的方法呢?
? 答案是有的,使用_tran.GetComponentsInChildren即可,示例代碼如下:
var _ms = transform.GetComponentsInChildren<SkinnedMeshRenderer>();
5,改變?nèi)謘hader屬性
? 比如我們有很多使用了某一shader的物體,其中包括AI、場景等等,如果要頻繁改變這些材質(zhì)球的某一屬性,不可能遍歷去尋找的。
? 好在引擎為我們提供好了方法,示例函數(shù)如下:文章來源:http://www.zghlxwxcb.cn/news/detail-632803.html
Shader.SetGlobalFloat("_YydInterval", _getTime);
? 同理我們可以用set來改變更多的屬性,比如Shader.SetGlobalTexture來改變?nèi)值馁N圖等等。文章來源地址http://www.zghlxwxcb.cn/news/detail-632803.html
到了這里,關(guān)于Unity Shader:常用的C#與shader交互的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!