214 lines
6.0 KiB
C#
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;
|
|
}
|
|
}
|
|
|
|
}
|