using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Carrie.Net;
using CommonUI.Editor.UI;
using CommonUI_Unity3D.Impl;
using JsonFx.Json;
using System;
public class Character3DController : MonoBehaviour, IScene
{
public class CharactorCell
{
public byte prof;
public uint ID;
public GameObject GO;
}
public AssemblerInfo m_Data_AvatarInfo_SS = new AssemblerInfo(0, NetConstant.CHARACTER_NAME_ARCANEARCHER, NetConstant.CHARACTER_NAME_ARCANEARCHER + "_head_0000", NetConstant.CHARACTER_NAME_ARCANEARCHER + "_body_0000", "", "", "weapon2001", "", "wing_0001");
public AssemblerInfo m_Data_AvatarInfo_ZS = new AssemblerInfo(0, NetConstant.CHARACTER_NAME_UNKNOW, NetConstant.CHARACTER_NAME_UNKNOW + "_head_0000", NetConstant.CHARACTER_NAME_UNKNOW + "_body_0000", "", "weapon0001", "", "", "wing_0001");
private static Dictionary<byte, CharactorCell> mCharactorCellList = new Dictionary<byte, CharactorCell>();
private static Dictionary<OpenType, DeployData> mDeployData = new Dictionary<OpenType, DeployData>();
UECanvas mUECanvas;
Texture2D mTex = null;
RenderTexture targetTexture;
UnityImage image;
private static Character3DController m_Instance = null;
void Awake()
{
int w = Screen.width;
Load(w.ToString());
m_Instance = this;
SceneManager.Instance.AddListener(this);
}
void OnApplicationQuit()
{
Assembler.GetInstance().OnFinishLoading -= HandleModelProf;
m_Instance = null;
}
IEnumerator Start()
{
Assembler.GetInstance().OnFinishLoading += HandleModelProf;
LoadProfModel(NetConstant.CHARACTER_TYPE_WARRIOR);
LoadProfModel(NetConstant.CHARACTER_TYPE_THIEF);
LoadProfModel(NetConstant.CHARACTER_TYPE_ARCANEARCHER);
yield return 0;
}
public void HandleOnEnterScene(SceneManager sender)
{
}
public void HandleOnLeaveScene(SceneManager sender)
{
if (mCharactorCellList != null)
{
foreach (CharactorCell cell in mCharactorCellList.Values)
{
if (cell.GO != null)
{
cell.GO.SetActive(false);
UnityEngine.Object.Destroy(cell.GO);
}
}
mCharactorCellList.Clear();
}
Assembler.GetInstance().OnFinishLoading -= HandleModelProf;
}
/// <summary>
/// Load Cell For Prof
/// </summary>
/// <param name="prof"></param>
void LoadProfModel(byte prof)
{
if (!mCharactorCellList.ContainsKey(prof))
{
CharactorCell cell = new CharactorCell();
cell.prof = prof;
{
AssemblerInfo info = null;
switch (prof)
{
case NetConstant.CHARACTER_TYPE_WARRIOR:
info = m_Instance.m_Data_AvatarInfo_ZS;
break;
case NetConstant.CHARACTER_TYPE_THIEF:
break;
case NetConstant.CHARACTER_TYPE_ARCANEARCHER:
info = m_Instance.m_Data_AvatarInfo_SS;
break;
case NetConstant.CHARACTER_TYPE_UNKNOW:
info = null;
break;
default:
Debug.LogError("prof error");
break;
}
cell.ID = Assembler.GetInstance().Create(info);
}
{
// default is null,
cell.GO = null;
}
mCharactorCellList.Add(prof, cell);
}
else
{
Debug.LogWarning("Repeat Add");
}
}
/// <summary>
/// show model for prof
/// </summary>
/// <param name="prof"></param>
void ShowProModel(bool open, byte prof, DeployData deployData)
{
if (open)
{
m_Camera.SetActive(true);
m_Model.SetActive(true);
m_Camera.GetComponent<Camera>().orthographicSize = deployData.size;
}
else
{
m_Camera.SetActive(false);
m_Model.SetActive(false);
}
foreach (CharactorCell cell in mCharactorCellList.Values)
{
if (cell.GO != null)
{
if (prof == cell.prof)
{
cell.GO.SetActive(true);
cell.GO.transform.localPosition = new Vector3(deployData.x,deployData.y,0);
Play(cell.GO);
}
else
cell.GO.SetActive(false);
}
}
m_Camera.camera.Render();
}
/// <summary>
/// Udpate GameObject of Cell
/// </summary>
/// <param name="open"></param>
/// <param name="prof"></param>
/// <param name="info"></param>
/// <param name="canvas"></param>
static public void Update3D(bool open, byte prof,OpenType type,AssemblerInfo info = null)
{
if (info != null)
{
string data = JsonWriter.Serialize(info);
Debug.Log(open + " " + NetConstant.GetResNameByProf(prof) + " " + data);
}
DeployData deployData = mDeployData[type];
m_Instance.ShowProModel(open, prof,deployData);
///
/// if null, info is deafult
///
if (info == null)
{
switch (prof)
{
case NetConstant.CHARACTER_TYPE_WARRIOR:
info = m_Instance.m_Data_AvatarInfo_ZS;
break;
case NetConstant.CHARACTER_TYPE_THIEF:
break;
case NetConstant.CHARACTER_TYPE_ARCANEARCHER:
info = m_Instance.m_Data_AvatarInfo_SS;
break;
case NetConstant.CHARACTER_TYPE_UNKNOW:
info = null;
break;
default:
Debug.LogError("prof error");
break;
}
}
if (!open) return;
CharactorCell cell = (CharactorCell)mCharactorCellList[prof];
//
// Control
//
// if (canvas != m_Instance.mUECanvas)
// {
// m_Instance.mUECanvas = canvas;
//
// int width = (int)canvas.Width;
// int height = (int)canvas.Height;
// m_Instance.mTex = new Texture2D(width, height);
// m_Instance.targetTexture = new RenderTexture(width, height, 24);
// m_Instance.m_Camera.camera.targetTexture = m_Instance.targetTexture;
//
// m_Instance.image = new UnityImage(m_Instance.mTex, width, height);
// m_Instance.mUECanvas.SetImage(m_Instance.image);
// }
Assembler.GetInstance().Update(cell.ID, info);
}
public GameObject m_Model;
public GameObject m_Camera;
void HandleModelProf(uint id)
{
if (m_Instance == null)
return;
foreach (CharactorCell cell in mCharactorCellList.Values)
{
if (id == cell.ID)
{
// first create
if (cell.GO == null)
{
cell.GO = Assembler.GetInstance().GetObject(cell.ID);
cell.GO.SetActive(true);
cell.GO.transform.parent = m_Model.transform;
cell.GO.transform.localPosition = Vector3.zero;
cell.GO.transform.localEulerAngles = Vector3.zero;
foreach (Transform t in cell.GO.GetComponentsInChildren<Transform>())
if (t.gameObject != null)
t.gameObject.layer = m_Model.layer;
}
// Play(cell.GO);
}
}
if (m_Camera!= null && m_Camera.camera != null && m_Camera.camera.enabled)
m_Camera.camera.Render();
}
public delegate void PostRenderDelegate();
public PostRenderDelegate PostRender;
/// <summary>
/// update render texutre
/// </summary>
public void OnPostRender()
{
if (mUECanvas == null)
return;
// m_Camera.GetComponent<Camera>().orthographicSize = cameraSize;
// mTex.ReadPixels(new Rect(0, 0, targetTexture.width, targetTexture.height), 0, 0);
// mTex.Apply();
}
#region 播放动画
private void Play(GameObject obj)
{
Animation anim = obj.GetComponent<Animation>();
if (anim != null)
{
AnimationState animState = anim[Bundle_Animation.n_idle];
if (animState != null)
animState.wrapMode = WrapMode.Loop;
anim.Play(Bundle_Animation.n_idle);
PlayAnimation(obj);
}
}
void PlayAnimation(GameObject o)
{
Transform[] hips = o.GetComponentsInChildren<Transform>();
foreach (Transform hip in hips)
{
if (hip.name.Equals("wing"))
{
GameObject wing = hip.gameObject;
wing.animation.wrapMode = WrapMode.Loop;
wing.animation.Play("n_run");
break;
}
}
}
#endregion
public void HandlePrepareEnterScene(SceneManager sender, PrepareDone done)
{
done(this);
}
public void HandlePrepareLeaveScene(SceneManager sender, PrepareDone done)
{
done(this);
}
IniParser parser = null;
float cameraSize = 1.0f;
public void Load(string width)
{
int wight = Screen.width;
TextAsset ta = (TextAsset)Resources.Load("Data/test", typeof(TextAsset));
parser = new IniParser(ta);
LoadInfo(OpenType.CHARATOR_VIEW, width);
LoadInfo(OpenType.CHARATOR_PACK, width);
}
private void LoadInfo(OpenType type,string width)
{
String str = parser.GetSetting(type.ToString(), width);
string[] strArray = str.Split(new char[] { ',' });
DeployData data = new DeployData();
data.x = float.Parse(strArray[0]);
data.y = float.Parse(strArray[1]);
data.size = float.Parse(strArray[2]);
mDeployData.Add(type, data);
}
//3D人物使用配置数据
private void SetCameraSize(float value)
{
m_Camera.GetComponent<Camera>().orthographicSize = value;
}
private void SetCharactorPos(float x,float y)
{
}
private void SetMaterial()
{
//renderer.material.mainTexture
}
public class DeployData
{
public float x;
public float y;
public float size;
}
public enum OpenType
{
CHARATOR_VIEW,
CHARATOR_PACK,
}
}