miduo_client/Assets/LuaFramework/Scripts/Manager/RoleRenderManager.cs

214 lines
6.0 KiB
C#

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<RoleRenderManager>
{
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<Material>("R0") as Material),
// (App.ResMgr.LoadAsset<Material>("R1") as Material),
// (App.ResMgr.LoadAsset<Material>("R2") as Material),
// (App.ResMgr.LoadAsset<Material>("R3") as Material),
// (App.ResMgr.LoadAsset<Material>("R4") as Material),
// (App.ResMgr.LoadAsset<Material>("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"),
};
/// <summary>
/// 初始化组件
/// </summary>
/// <param name="uiCam"></param>
/// <param name="roleCam"></param>
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<Camera>();
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;
}
}
/// <summary>
/// 更新command Buffer
/// </summary>
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<MeshRenderer>();
// 刷新一遍显示
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;
}
}
}