ChivaVR_JD_ShaderController.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. /// <summary>
  5. /// 胶带端部展示类型
  6. /// </summary>
  7. public enum JDLineType
  8. {
  9. lineoff = 1, //无端部胶带,无胶带卷
  10. lineon_JDJuan, //端部胶带,胶带卷
  11. lineon_NoJDJuan //端部胶带,无胶带卷
  12. }
  13. /// <summary>
  14. /// 胶带材质球控制器
  15. /// </summary>
  16. public class ChivaVR_JD_ShaderController : MonoBehaviour
  17. {
  18. public Material jd_Mat;
  19. [SerializeField]
  20. private JDLineType jdLineType = JDLineType.lineon_JDJuan;
  21. #region Parameter
  22. public float radius; //半径
  23. public float maxAngle; //最大缠绕角度
  24. public float backAngle; //伸出部分角度
  25. public float value; //当前缠绕角度
  26. public bool setJDShaderParameter; //Editor是否开启参数设置
  27. public float moveOffset; //横向偏移量
  28. public float dampMoveOffsetAngle; //不参与偏移的初始角度范围
  29. public float upOffset; //纵向偏移量
  30. public bool hiddenLine; //是否隐藏连接线
  31. public bool hiddenJDJuan; //是否隐藏胶带卷
  32. public float lineShowLength; //连接线长度
  33. //胶带缠绕部分贴图及法线贴图Tilling
  34. public Vector2 jd_TexAndNormailMap_Tiling;
  35. //胶带缠绕部分贴图及法线贴图Offset
  36. public Vector2 jd_TexAndNormailMap_Offset;
  37. #endregion
  38. #region Editor Inspector Set Parameter
  39. /// <summary>
  40. /// Inspector面板设置JDShader信息
  41. /// </summary>
  42. public void InspectorResetJDShaderInfo()
  43. {
  44. if (jd_Mat == null)
  45. {
  46. jd_Mat = this.GetComponent<MeshRenderer>().material;
  47. }
  48. SetJDValue(jd_Mat, value);
  49. SetJDDirectionAngle(jd_Mat, backAngle);
  50. ResetJDLineType();
  51. if (!setJDShaderParameter) return;
  52. jd_Mat.SetFloat("_MaxAngle", maxAngle);
  53. jd_Mat.SetFloat("_MoveOffset", moveOffset);
  54. jd_Mat.SetFloat("_DampOffsetAngle", dampMoveOffsetAngle);
  55. jd_Mat.SetFloat("_UpOffset", upOffset);
  56. jd_Mat.SetFloat("_Radius", radius);
  57. jd_Mat.SetFloat("_LineShowLength", lineShowLength);
  58. jd_Mat.SetTextureScale("_MainTex", jd_TexAndNormailMap_Tiling);
  59. jd_Mat.SetTextureOffset("_MainTex", jd_TexAndNormailMap_Offset);
  60. jd_Mat.SetTextureScale("_BumpMap", jd_TexAndNormailMap_Tiling);
  61. jd_Mat.SetTextureOffset("_BumpMap", jd_TexAndNormailMap_Offset);
  62. }
  63. public void ReSetJDMat()
  64. {
  65. jd_Mat = this.GetComponent<MeshRenderer>().sharedMaterial;
  66. InspectorUpdateJDShaderInfo();
  67. }
  68. /// <summary>
  69. /// Inspector面板更新当前胶带材质Shader信息
  70. /// </summary>
  71. public void InspectorUpdateJDShaderInfo()
  72. {
  73. jd_Mat = this.GetComponent<MeshRenderer>().sharedMaterial;
  74. value = jd_Mat.GetFloat("_Value");
  75. backAngle = jd_Mat.GetFloat("_BackAngle");
  76. if (jd_Mat.GetFloat("_HiddenLine") == 0)
  77. {
  78. hiddenLine = false;
  79. }
  80. else if (jd_Mat.GetFloat("_HiddenLine") == 1)
  81. {
  82. hiddenLine = true;
  83. }
  84. if (jd_Mat.GetFloat("_HiddenJDJuan") == 0)
  85. {
  86. hiddenJDJuan = false;
  87. }
  88. else if (jd_Mat.GetFloat("_HiddenJDJuan") == 1)
  89. {
  90. hiddenJDJuan = true;
  91. }
  92. if (hiddenLine)
  93. {
  94. jdLineType = JDLineType.lineoff;
  95. }
  96. else if (hiddenJDJuan)
  97. {
  98. jdLineType = JDLineType.lineon_NoJDJuan;
  99. }
  100. else if (!hiddenJDJuan)
  101. {
  102. jdLineType = JDLineType.lineon_JDJuan;
  103. ;
  104. }
  105. maxAngle = jd_Mat.GetFloat("_MaxAngle");
  106. moveOffset = jd_Mat.GetFloat("_MoveOffset");
  107. dampMoveOffsetAngle = jd_Mat.GetFloat("_DampOffsetAngle");
  108. upOffset = jd_Mat.GetFloat("_UpOffset");
  109. radius = jd_Mat.GetFloat("_Radius");
  110. lineShowLength = jd_Mat.GetFloat("_LineShowLength");
  111. jd_TexAndNormailMap_Tiling = jd_Mat.GetTextureScale("_MainTex");
  112. jd_TexAndNormailMap_Offset = jd_Mat.GetTextureOffset("_MainTex");
  113. jd_TexAndNormailMap_Tiling = jd_Mat.GetTextureScale("_BumpMap");
  114. jd_TexAndNormailMap_Offset = jd_Mat.GetTextureOffset("_BumpMap");
  115. }
  116. public void ResetJDLineType()
  117. {
  118. switch (jdLineType)
  119. {
  120. case JDLineType.lineoff:
  121. SetJDHiddenLine(jd_Mat, true);
  122. jd_Mat.SetFloat("_HiddenLine", 1);
  123. break;
  124. case JDLineType.lineon_JDJuan:
  125. SetJDHiddenLine(jd_Mat, false);
  126. SetJDHiddenJDJuan(jd_Mat, false);
  127. jd_Mat.SetFloat("_HiddenLine", 0);
  128. jd_Mat.SetFloat("_HiddenJDJuan", 0);
  129. break;
  130. case JDLineType.lineon_NoJDJuan:
  131. SetJDHiddenLine(jd_Mat, false);
  132. SetJDHiddenJDJuan(jd_Mat, true);
  133. jd_Mat.SetFloat("_HiddenLine", 0);
  134. jd_Mat.SetFloat("_HiddenJDJuan", 1);
  135. break;
  136. default:
  137. break;
  138. }
  139. }
  140. /// <summary>
  141. /// 设置胶带Value
  142. /// </summary>
  143. /// <param name="_value"></param>
  144. protected void SetJDValue(Material mat, float _value)
  145. {
  146. value = Mathf.Clamp(_value, 0, maxAngle);
  147. mat.SetFloat("_Value", value);
  148. }
  149. /// <summary>
  150. /// 设置胶反向角度
  151. /// </summary>
  152. /// <param name="_value"></param>
  153. protected void SetJDDirectionAngle(Material mat, float _value)
  154. {
  155. backAngle = Mathf.Clamp(_value, 0, 180);
  156. mat.SetFloat("_BackAngle", backAngle);
  157. }
  158. /// <summary>
  159. /// 设置偏移量
  160. /// </summary>
  161. /// <param name="mat"></param>
  162. /// <param name="offset"></param>
  163. public void SetMoveOffset(Material mat, float offset)
  164. {
  165. moveOffset = offset;
  166. mat.SetFloat("_MoveOffset", moveOffset);
  167. }
  168. /// <summary>
  169. /// 设置不参与偏移的初始角度范围
  170. /// </summary>
  171. /// <param name="mat"></param>
  172. /// <param name="_value"></param>
  173. protected void SetDampOffsetAngle(Material mat, float _value)
  174. {
  175. dampMoveOffsetAngle = _value;
  176. mat.SetFloat("_DampOffsetAngle", dampMoveOffsetAngle);
  177. }
  178. /// <summary>
  179. /// 设置胶带伸出部分状态
  180. /// </summary>
  181. /// <param name="state"></param>
  182. protected void SetJDHiddenLine(Material mat, bool state)
  183. {
  184. hiddenLine = state;
  185. if (hiddenLine)
  186. {
  187. mat.EnableKeyword("_HIDDENLINE_ON");
  188. }
  189. else
  190. {
  191. mat.DisableKeyword("_HIDDENLINE_ON");
  192. }
  193. }
  194. /// <summary>
  195. /// 设置胶带伸出部分状态
  196. /// </summary>
  197. /// <param name="state"></param>
  198. protected void SetJDHiddenJDJuan(Material mat, bool state)
  199. {
  200. hiddenJDJuan = state;
  201. if (hiddenJDJuan)
  202. {
  203. mat.EnableKeyword("_HIDDENJDJUAN_ON");
  204. }
  205. else
  206. {
  207. mat.DisableKeyword("_HIDDENJDJUAN_ON");
  208. }
  209. }
  210. #endregion
  211. void Awake()
  212. {
  213. jd_Mat = this.GetComponent<MeshRenderer>().material;
  214. }
  215. /// <summary>
  216. /// 设置胶带Value
  217. /// </summary>
  218. /// <param name="_value">缠绕角度</param>
  219. public void SetJDValue(float _value)
  220. {
  221. SetJDValue(jd_Mat, _value);
  222. }
  223. /// <summary>
  224. /// 设置胶带Normail
  225. /// </summary>
  226. /// <param name="_normail">0-1胶带缠绕normail</param>
  227. public void SetJDNormail(float _normail)
  228. {
  229. SetJDValue(jd_Mat, _normail * maxAngle);
  230. }
  231. /// <summary>
  232. /// 设置胶带卷正朝向夹角角度
  233. /// </summary>
  234. /// <param name="_value">0-1胶带卷朝向夹角normail</param>
  235. public void SetJDDirectionAngle(float _value)
  236. {
  237. SetJDDirectionAngle(jd_Mat, _value);
  238. }
  239. /// <summary>
  240. /// 隐藏连接线
  241. /// </summary>
  242. /// <param name="state"></param>
  243. public void SetJDHiddenLine(bool state)
  244. {
  245. SetJDHiddenLine(jd_Mat, state);
  246. }
  247. /// <summary>
  248. /// 设置胶带端部展示类型
  249. /// </summary>
  250. /// <param name="type"></param>
  251. public void SetJDLineType(JDLineType type)
  252. {
  253. jdLineType = type;
  254. ResetJDLineType();
  255. }
  256. /// <summary>
  257. /// 设置胶带水平偏移量
  258. /// </summary>
  259. /// <param name="offset"></param>
  260. public void SetMoveOffset(float offset)
  261. {
  262. SetMoveOffset(jd_Mat, offset);
  263. }
  264. }