3D模型--UITexture

来源:互联网 发布:java 短信发送限制 编辑:程序博客网 时间:2024/04/28 11:38
using UnityEngine;using System.Collections;using System.Collections.Generic;using NTFrame;public class RenderAvatar : SingletonMono<RenderAvatar> {public delegate void DoSomething(RenderAvatarItem item);static int _OffsetY = 5;public void CreateAvatar(string assetbundleName, string assetName, DoSomething del, UITexture target, bool dragble,int size = 1024){List<string> actions = new List<string>();actions.Add(StringDefine.Idle);StartCoroutine(BeginCreate(assetbundleName, assetName, del, target, dragble, true,actions,size));}public void CreateAvatarWithBuild(string assetbundleName, string assetName, DoSomething del, UITexture target, bool dragble,int size = 1024){List<string> actions = new List<string>();StartCoroutine(BeginCreate(assetbundleName, assetName, del, target, dragble, true,actions,size));}public void CreateAvatarWithActions(string assetbundleName, string assetName, DoSomething del, UITexture target, bool dragble,List<string> actions, int size = 1024){StartCoroutine(BeginCreate(assetbundleName, assetName, del, target, dragble, true,actions,size));}IEnumerator BeginCreate(string assetbundleName, string assetName, DoSomething del, UITexture target, bool dragble, bool renderNow,List<string> actions,int size){if(target == null){Debug.LogError("target texture is null!");yield break;}RenderAvatarItem item = target.GetComponent<RenderAvatarItem>();if(item != null){if(item.node != null){if(item.node.name == assetName){item.oldOne = true;if (renderNow){target.mainTexture = item.tex;                    }if(del != null){del(item);}yield break;}}StartCoroutine(Put2Destroy(item.node));yield return null;}yield return StartCoroutine(ResourceManager.Instance.Load<GameObject>(assetbundleName, assetName));GameObject model = ResourceManager.Instance.GetInstantiateAsset(assetbundleName);if (model == null){if(del != null){del(null);}target.mainTexture = null;if (item != null){item.tex = null;}yield break;}LayerManger.SetLayer(model, LayerManger.PLAYER);// load animation//List<string> actions = new List<string>();//actions.Add(StringDefine.Idle);Animator ani = model.GetComponent<Animator>();if(ani == null){ani = model.AddComponent<Animator>();}yield return StartCoroutine(ModelLoader.Instance.OverrideHeroAniamtorCor(model, assetName, null,actions));                GameObject camObj = new GameObject(assetName + "_Cam");        Camera cam = camObj.AddComponent<Camera>();                GameObject node = new GameObject(assetName);        // 全挂在avatar节点下,不然太乱        node.transform.parent = gameObject.transform;camObj.transform.parent = node.transform;camObj.transform.position = new Vector3(10000, _OffsetY+1, 9996);cam.clearFlags = CameraClearFlags.SolidColor;cam.cullingMask = cam.cullingMask << LayerManger.GetLayer(LayerManger.PLAYER);RenderTexture tex = new RenderTexture(size, size, 24);tex.format = RenderTextureFormat.ARGB32;cam.targetTexture = tex;cam.fieldOfView = 45;cam.backgroundColor = new Color(0, 0, 0, 0);model.transform.parent = node.transform;model.transform.position = new Vector3(10000, _OffsetY, 10000);model.transform.eulerAngles = Quaternion.Euler(new Vector3(5, -180, 0)).eulerAngles;// 偏移一下_OffsetY += 20;item = target.GetComponent<RenderAvatarItem>();if(item == null){item = target.gameObject.AddComponent<RenderAvatarItem>();}item.cam = cam;item.tex = tex;item.model = model;item.node = node;item.target = target;item.oldOne = false;if(target != null){if (renderNow){target.mainTexture = tex;}if(dragble == false){BoxCollider collider = target.gameObject.GetComponent<BoxCollider>();if(collider != null){collider.enabled = false;}}else{UIEventListener lis = target.GetComponent<UIEventListener>();if(lis != null){lis.onDrag += item.OnItemDrag;}}}// must in endif(del != null){del(item);        }}public void CreateAvatarByShow(string assetbundleName, string assetName, DoSomething del, UITexture target, bool dragble){StartCoroutine(BeginCreateShow(assetbundleName, assetName, del, target, dragble));}IEnumerator BeginCreateShow(string assetbundleName, string assetName, DoSomething del, UITexture target, bool dragble){if(target == null){del(null);yield break;}RenderAvatarItem item = target.GetComponent<RenderAvatarItem>();if (item != null && item.node != null && item.node.name == assetName && item.model != null){target.mainTexture = item.tex;Animator animator = item.model.GetComponent<Animator>();if (animator != null){//animator.Rebind();animator.Play(StringDefine.Show);}if(del != null){del(item);}yield break;}List<string> actions = new List<string>();actions.Add(StringDefine.Idle);actions.Add(StringDefine.Show);yield return StartCoroutine(BeginCreate(assetbundleName, assetName, null, target, dragble, false,actions,1024));item = target.GetComponent<RenderAvatarItem>();if(item == null || item.tex == null){target.mainTexture = null;del(null);yield break;}// 添加特效List<HeroEffectData> effects = HeroEffectDataProvider.GetInstance().GetDataById(assetName);if (effects != null && effects.Count > 0){for (int i = 0;i < effects.Count;i ++){HeroEffectData info = effects[i];string particleName = info.effects_res;string effectpos = info.effects_position;yield return StartCoroutine(ResourceManager.Instance.Load<GameObject>(string.Format("{0}{1}", StringDefine.ParticlePrefab, particleName), particleName));GameObject particle = ResourceManager.Instance.GetInstantiateAsset(string.Format("{0}{1}", StringDefine.ParticlePrefab, particleName));if(particle != null){if (item == null || item.node == null){Destroy(particle);del(null);yield break;}particle.SetActive(true);item.particle = particle;LayerManger.SetLayer(particle, LayerManger.PLAYER);GameObject parentnode = null;if (string.IsNullOrEmpty(effectpos)){parentnode = item.model;}else{parentnode = ObjectCommon.GetChild(item.model, effectpos);}if (parentnode != null){particle.transform.parent = parentnode.transform;}else{particle.transform.parent = item.model.transform;}particle.transform.localPosition = Vector3.zero;particle.transform.localRotation = Quaternion.Euler(Vector3.zero);}else{Debuger.LogError("show particle load failed! " + assetName);}}}//        ModelLoader.Instance.OverrideHeroAnimator(item.model, assetName, actions, (obj) =>//{//if(obj != null && item != null && item.cam != null)//{//Animator animator = obj.GetComponent<Animator>();//if(animator != null)//{//animator.Rebind();//animator.Play(StringDefine.Show);//                    item.target.mainTexture = item.cam.targetTexture;//}//}//});if(item != null && item.model != null && item.cam != null){Animator animator = item.model.GetComponent<Animator>();if(animator != null){//animator.Rebind();animator.Play(StringDefine.Show);item.target.mainTexture = item.cam.targetTexture;}}if(del != null){del(item);}if (dragble){// 加载展示台ResourceManager.Instance.LoadPrefab(StringDefine.ParticlePrefab + "zhanshitai", "zhanshitai", (obj)=>{if (obj == null){return;}if (item.model == null){Destroy(obj);return;}GameObject go = obj as GameObject;if (go == null){return;}go.transform.parent = item.node.transform;go.transform.localPosition = item.model.transform.position - RenderAvatarItem.taiziOffset;go.transform.localRotation = Quaternion.Euler(Vector3.zero);LayerManger.SetLayer(go, LayerManger.PLAYER);item.taizi = go;});}}IEnumerator Put2Destroy(GameObject obj){if (obj == null){yield break;}yield return new WaitForSeconds(1f);Destroy(obj);}}public class RenderAvatarItem : MonoBehaviour{public Camera cam;public RenderTexture tex;public GameObject model;public GameObject node;public Animator animator;public GameObject particle;public UITexture target;public GameObject taizi;public bool oldOne = false;public static Vector3 taiziOffset = new Vector3(0, 0.3f, 0);public Camera GetCamera(){return cam;}public void PlayAction(string actionName){if(animator == null && model != null){animator = model.GetComponent<Animator>();}if(animator != null){animator.Play(actionName);}}public Animator GetAnimator(){if(animator == null && model != null){animator = model.GetComponent<Animator>();}return animator;}public GameObject GetModel(){return model;}public void Rotate(Vector3 rot){if(model != null)model.transform.Rotate(rot);}public void ChangeToCamera(Camera copycamera){if(copycamera == null || cam == null)return;Transform trans = cam.transform;Transform copytrans = copycamera.transform;trans.localPosition = copytrans.localPosition;trans.localRotation = copytrans.localRotation;trans.localScale = copytrans.localScale;cam.fieldOfView = copycamera.fieldOfView;}public void SetCullingMask(int layer){if(cam == null)return;cam.cullingMask = (1<<layer);LayerManger.SetLayer(model,layer);}public void SetItemLocalPosition(Vector3 pos){if(pos == null || model == null)return;model.transform.localPosition = pos;}public void SetItemLocalRotation(Vector3 rot){if(rot == null || model == null)return;model.transform.localEulerAngles = rot;}public void SetItemLocalScale(Vector3 scale){if(model == null)return;model.transform.localScale = scale;}public void OnItemDrag(GameObject go, Vector2 delta){if(model != null){model.transform.Rotate(Vector3.up, -delta.x/3f);}if (taizi != null){taizi.transform.Rotate(Vector3.up, -delta.x / 3f);}}void OnDisable(){if(cam != null){cam.enabled = false;}if(model != null){model.SetActive(false);}if(target != null){target.mainTexture = null;}if(animator != null){animator.enabled = false;        }if(particle != null){particle.SetActive(false);}}void OnEnable(){if(cam != null){cam.enabled = true;}if(model != null){model.SetActive(true);}if(animator != null){animator.enabled = true;}if(particle != null){particle.SetActive(true);}}void OnDestroy(){tex = null;animator = null;DestroyImmediate(model);DestroyImmediate(node);DestroyImmediate(particle);}public void ReleaseRes(){tex = null;animator = null;DestroyImmediate(model);DestroyImmediate(node);DestroyImmediate(particle);}}

0 0
原创粉丝点击