using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; using GameCore; #if UNITY_EDITOR using UnityEditor; [CustomEditor(typeof(RoleRenderManager))] public class RoleRenderManagerEditor : Editor { public override void OnInspectorGUI() { if(GUILayout.Button("Init")) { var man = (target as RoleRenderManager); if( man.uiCam == null) { EditorUtility.DisplayDialog("错误", "请先配置UI Cam", "OK"); } //if (man.roleCam == null) //{ // EditorUtility.DisplayDialog("错误", "请先配置Role Cam", "OK"); //} if ( man.uiCam != null ) { man.Init(man.uiCam); man.UpdateCMD(); } } if (GUILayout.Button("update")) { var man = (target as RoleRenderManager); man.UpdateCMD(); } base.OnInspectorGUI(); } } #endif public class RoleRenderManager : UnitySingleton { public Camera uiCam; public Camera roleCam; public CameraEvent camEvent = CameraEvent.BeforeForwardAlpha; public int width = 640; public int height = 960; public MeshRenderer[] roleRenderer = new MeshRenderer[6]; public GameObject root; CommandBuffer cmd; static Material[] TargetMaterial = new Material[6]; //{ // (App.ResMgr.LoadAsset("R0") as Material), // (App.ResMgr.LoadAsset("R1") as Material), // (App.ResMgr.LoadAsset("R2") as Material), // (App.ResMgr.LoadAsset("R3") as Material), // (App.ResMgr.LoadAsset("R4") as Material), // (App.ResMgr.LoadAsset("R5") as Material), //}; static readonly int[] RoleRTId = new int[] { Shader.PropertyToID("_RoleTex0_RT"), Shader.PropertyToID("_RoleTex1_RT"), Shader.PropertyToID("_RoleTex2_RT"), Shader.PropertyToID("_RoleTex3_RT"), Shader.PropertyToID("_RoleTex4_RT"), Shader.PropertyToID("_RoleTex5_RT"), }; static readonly int[] RoleTexId = new int[] { Shader.PropertyToID("_RoleTex0"), Shader.PropertyToID("_RoleTex1"), Shader.PropertyToID("_RoleTex2"), Shader.PropertyToID("_RoleTex3"), Shader.PropertyToID("_RoleTex4"), Shader.PropertyToID("_RoleTex5"), }; /// /// 初始化组件 /// /// /// public void Init(Camera uiCam) { if(root == null) { var prefab = App.ResMgr.LoadAsset("CardRendererRoot2"); root = GameObject.Instantiate(prefab) as GameObject; root.transform.parent = this.transform; App.ResMgr.UnLoadAsset("CardRendererRoot2"); } this.roleCam = root.GetComponentInChildren(); if( roleCam != null && roleCam.enabled ){ roleCam.enabled = false; } this.uiCam = uiCam; if( uiCam != null) { cmd = new CommandBuffer(); uiCam.AddCommandBuffer(camEvent, cmd); } for(int i = 0; i < 6; i++) { XDebug.Log.l("加载材质:"); Material m = App.ResMgr.LoadAsset("R" + i) as Material; XDebug.Log.l("目标材质:" + m.name); TargetMaterial[i] = m; } } /// /// 更新command Buffer /// public void UpdateCMD() { cmd.Clear(); int roleCount = Mathf.Min(RoleRTId.Length, roleRenderer.Length); RenderTextureDescriptor rtDes = new RenderTextureDescriptor(width, height, RenderTextureFormat.ARGB32, 0); cmd.SetViewMatrix(roleCam.worldToCameraMatrix); cmd.SetProjectionMatrix(roleCam.projectionMatrix); for (int i = 0; i < roleCount; i++) { cmd.GetTemporaryRT(RoleRTId[i], rtDes); cmd.SetRenderTarget(RoleRTId[i]); cmd.ClearRenderTarget(false, true, Color.clear); if (roleRenderer[i] != null) { cmd.DrawRenderer(roleRenderer[i], roleRenderer[i].sharedMaterial); } cmd.SetGlobalTexture(RoleTexId[i], RoleRTId[i]); } cmd.SetProjectionMatrix(uiCam.projectionMatrix); cmd.SetViewMatrix(uiCam.worldToCameraMatrix); cmd.SetRenderTarget(BuiltinRenderTextureType.CameraTarget); } // 设置要渲染的立绘 public Material SetCardRender(int pos, GameObject renderLive) { ClearRender(pos); int index = pos - 1; this.roleRenderer[index] = renderLive.GetComponent(); // 刷新一遍显示 this.UpdateCMD(); // 返回设置的render所使用的material return TargetMaterial[index]; } public Material GetCardRender(int pos) { int index = pos - 1; if (TargetMaterial[index] != null) { return TargetMaterial[index]; } return null; } public void ClearRender(int pos) { int index = pos - 1; if (this.roleRenderer[index] != null) { this.roleRenderer[index] = null; } } public void ClearAllRender() { for(int index = 0; index < 6; index++) { if (this.roleRenderer[index] != null) { this.roleRenderer[index] = null; } } } // Start is called before the first frame update void OnEnable() { if (uiCam != null && roleCam != null && cmd != null) { UpdateCMD(); } } private void OnDisable() { if (uiCam != null && cmd != null) { uiCam.RemoveCommandBuffer(camEvent, cmd); cmd.Clear(); } } private void OnDestroy() { if (cmd != null) { cmd.Dispose(); cmd = null; } } }