using System.Collections; using System.Collections.Generic; using UnityEngine; /// /// 胶带端部展示类型 /// public enum JDLineType { lineoff = 1, //无端部胶带,无胶带卷 lineon_JDJuan, //端部胶带,胶带卷 lineon_NoJDJuan //端部胶带,无胶带卷 } /// /// 胶带材质球控制器 /// public class ChivaVR_JD_ShaderController : MonoBehaviour { public Material jd_Mat; [SerializeField] private JDLineType jdLineType = JDLineType.lineon_JDJuan; #region Parameter public float radius; //半径 public float maxAngle; //最大缠绕角度 public float backAngle; //伸出部分角度 public float value; //当前缠绕角度 public bool setJDShaderParameter; //Editor是否开启参数设置 public float moveOffset; //横向偏移量 public float dampMoveOffsetAngle; //不参与偏移的初始角度范围 public float upOffset; //纵向偏移量 public bool hiddenLine; //是否隐藏连接线 public bool hiddenJDJuan; //是否隐藏胶带卷 public float lineShowLength; //连接线长度 //胶带缠绕部分贴图及法线贴图Tilling public Vector2 jd_TexAndNormailMap_Tiling; //胶带缠绕部分贴图及法线贴图Offset public Vector2 jd_TexAndNormailMap_Offset; #endregion #region Editor Inspector Set Parameter /// /// Inspector面板设置JDShader信息 /// public void InspectorResetJDShaderInfo() { if (jd_Mat == null) { jd_Mat = this.GetComponent().material; } SetJDValue(jd_Mat, value); SetJDDirectionAngle(jd_Mat, backAngle); ResetJDLineType(); if (!setJDShaderParameter) return; jd_Mat.SetFloat("_MaxAngle", maxAngle); jd_Mat.SetFloat("_MoveOffset", moveOffset); jd_Mat.SetFloat("_DampOffsetAngle", dampMoveOffsetAngle); jd_Mat.SetFloat("_UpOffset", upOffset); jd_Mat.SetFloat("_Radius", radius); jd_Mat.SetFloat("_LineShowLength", lineShowLength); jd_Mat.SetTextureScale("_MainTex", jd_TexAndNormailMap_Tiling); jd_Mat.SetTextureOffset("_MainTex", jd_TexAndNormailMap_Offset); jd_Mat.SetTextureScale("_BumpMap", jd_TexAndNormailMap_Tiling); jd_Mat.SetTextureOffset("_BumpMap", jd_TexAndNormailMap_Offset); } public void ReSetJDMat() { jd_Mat = this.GetComponent().sharedMaterial; InspectorUpdateJDShaderInfo(); } /// /// Inspector面板更新当前胶带材质Shader信息 /// public void InspectorUpdateJDShaderInfo() { jd_Mat = this.GetComponent().sharedMaterial; value = jd_Mat.GetFloat("_Value"); backAngle = jd_Mat.GetFloat("_BackAngle"); if (jd_Mat.GetFloat("_HiddenLine") == 0) { hiddenLine = false; } else if (jd_Mat.GetFloat("_HiddenLine") == 1) { hiddenLine = true; } if (jd_Mat.GetFloat("_HiddenJDJuan") == 0) { hiddenJDJuan = false; } else if (jd_Mat.GetFloat("_HiddenJDJuan") == 1) { hiddenJDJuan = true; } if (hiddenLine) { jdLineType = JDLineType.lineoff; } else if (hiddenJDJuan) { jdLineType = JDLineType.lineon_NoJDJuan; } else if (!hiddenJDJuan) { jdLineType = JDLineType.lineon_JDJuan; ; } maxAngle = jd_Mat.GetFloat("_MaxAngle"); moveOffset = jd_Mat.GetFloat("_MoveOffset"); dampMoveOffsetAngle = jd_Mat.GetFloat("_DampOffsetAngle"); upOffset = jd_Mat.GetFloat("_UpOffset"); radius = jd_Mat.GetFloat("_Radius"); lineShowLength = jd_Mat.GetFloat("_LineShowLength"); jd_TexAndNormailMap_Tiling = jd_Mat.GetTextureScale("_MainTex"); jd_TexAndNormailMap_Offset = jd_Mat.GetTextureOffset("_MainTex"); jd_TexAndNormailMap_Tiling = jd_Mat.GetTextureScale("_BumpMap"); jd_TexAndNormailMap_Offset = jd_Mat.GetTextureOffset("_BumpMap"); } public void ResetJDLineType() { switch (jdLineType) { case JDLineType.lineoff: SetJDHiddenLine(jd_Mat, true); jd_Mat.SetFloat("_HiddenLine", 1); break; case JDLineType.lineon_JDJuan: SetJDHiddenLine(jd_Mat, false); SetJDHiddenJDJuan(jd_Mat, false); jd_Mat.SetFloat("_HiddenLine", 0); jd_Mat.SetFloat("_HiddenJDJuan", 0); break; case JDLineType.lineon_NoJDJuan: SetJDHiddenLine(jd_Mat, false); SetJDHiddenJDJuan(jd_Mat, true); jd_Mat.SetFloat("_HiddenLine", 0); jd_Mat.SetFloat("_HiddenJDJuan", 1); break; default: break; } } /// /// 设置胶带Value /// /// protected void SetJDValue(Material mat, float _value) { value = Mathf.Clamp(_value, 0, maxAngle); mat.SetFloat("_Value", value); } /// /// 设置胶反向角度 /// /// protected void SetJDDirectionAngle(Material mat, float _value) { backAngle = Mathf.Clamp(_value, 0, 180); mat.SetFloat("_BackAngle", backAngle); } /// /// 设置偏移量 /// /// /// public void SetMoveOffset(Material mat, float offset) { moveOffset = offset; mat.SetFloat("_MoveOffset", moveOffset); } /// /// 设置不参与偏移的初始角度范围 /// /// /// protected void SetDampOffsetAngle(Material mat, float _value) { dampMoveOffsetAngle = _value; mat.SetFloat("_DampOffsetAngle", dampMoveOffsetAngle); } /// /// 设置胶带伸出部分状态 /// /// protected void SetJDHiddenLine(Material mat, bool state) { hiddenLine = state; if (hiddenLine) { mat.EnableKeyword("_HIDDENLINE_ON"); } else { mat.DisableKeyword("_HIDDENLINE_ON"); } } /// /// 设置胶带伸出部分状态 /// /// protected void SetJDHiddenJDJuan(Material mat, bool state) { hiddenJDJuan = state; if (hiddenJDJuan) { mat.EnableKeyword("_HIDDENJDJUAN_ON"); } else { mat.DisableKeyword("_HIDDENJDJUAN_ON"); } } #endregion void Awake() { jd_Mat = this.GetComponent().material; } /// /// 设置胶带Value /// /// 缠绕角度 public void SetJDValue(float _value) { SetJDValue(jd_Mat, _value); } /// /// 设置胶带Normail /// /// 0-1胶带缠绕normail public void SetJDNormail(float _normail) { SetJDValue(jd_Mat, _normail * maxAngle); } /// /// 设置胶带卷正朝向夹角角度 /// /// 0-1胶带卷朝向夹角normail public void SetJDDirectionAngle(float _value) { SetJDDirectionAngle(jd_Mat, _value); } /// /// 隐藏连接线 /// /// public void SetJDHiddenLine(bool state) { SetJDHiddenLine(jd_Mat, state); } /// /// 设置胶带端部展示类型 /// /// public void SetJDLineType(JDLineType type) { jdLineType = type; ResetJDLineType(); } /// /// 设置胶带水平偏移量 /// /// public void SetMoveOffset(float offset) { SetMoveOffset(jd_Mat, offset); } }