// 本脚本只在不存在时会生成一次。组件逻辑写在当前脚本内。已存在不会再次生成覆盖 using System; using UnityEngine; using FairyGUI; using NBC; using RootMotion.FinalIK; using Object = UnityEngine.Object; namespace NBF { public partial class ModelTexture : GComponent { ModelRenderImage _renderImage; private Vector2 _startPos; private Vector3 _startRot; private SwipeGesture _swipeGesture; private bool _focus; private bool _canZoom; private bool _canPan; private Vector3 _zoomLimit; private Rect _panLimit; private void OnInited() { SetRotateListening(); // Stage.inst.on TouchHolder.onRollOver.Set(OnFocusIn); TouchHolder.onRollOut.Set(OnFocusOut); Stage.inst.onMouseWheel.Add(OnMouseWheel); // TouchHolder.onm } public override void Dispose() { Stage.inst.onMouseWheel.Remove(OnMouseWheel); base.Dispose(); } /// /// 加载资产模型 /// /// public void LoadAsset(int configId) { //Assets/Resources/gfx/hooks/berserk_hooks/clas_20421_20446/clas_20423.prefab //Assets/Resources/gfx/rods/syberia/bolo_10021/bolo_10021_LB400.prefab //"Role/test" var prefab = Resources.Load("gfx/hooks/berserk_hooks/clas_20421_20446/clas_20423"); SetModel((GameObject)Object.Instantiate(prefab)); } public void SetModel(GameObject model) { if (_renderImage == null) { _renderImage = new ModelRenderImage(ModelHolder.asGraph); } var ccdIk = model.GetComponent(); if (ccdIk != null) { Object.Destroy(ccdIk); } var lineRenderer = model.GetComponent(); if (lineRenderer != null) { Object.Destroy(lineRenderer); } var rigidbody = model.GetComponent(); if (rigidbody != null) { rigidbody.isKinematic = true; } _renderImage.SetModel(model); _renderImage.modelRoot.localScale = Vector3.one; var previewableAsset = model.GetComponent(); if (previewableAsset != null) { _zoomLimit = previewableAsset.zoom; _panLimit = previewableAsset.pan; _canPan = previewableAsset.canPan; _canZoom = previewableAsset.canZoom; // model.transform.localPosition = previewableAsset.position; model.transform.localScale = previewableAsset.scale; model.transform.localRotation = Quaternion.Euler(previewableAsset.rotation); } else { _canPan = false; _canZoom = false; _zoomLimit = Vector3.zero; _panLimit = Rect.zero; // model.transform.localPosition = previewableAsset.position; model.transform.localScale = Vector3.one; model.transform.localRotation = Quaternion.Euler(Vector3.zero); } } /// /// 加载角色模型 /// public void LoadRole() { } private void SetRotateListening() { var dragObj = TouchHolder; var gesture1 = new SwipeGesture(dragObj); gesture1.onMove.Set(OnSwipeMove); gesture1.onEnd.Set(OnSwipeEnd); } #region 旋转和平移 private void OnSwipeMove(EventContext context) { var gesture = context.sender as SwipeGesture; if (gesture == null) return; var v = Vector3.zero; if (context.inputEvent.button == 0) { v.y = -gesture.delta.x * 0.2f; v.z = -gesture.delta.y * 0.2f; if (!gesture.snapping) { v.y = 0; v.z = 0; } if (Mathf.Abs(v.y) < 1) //消除手抖影响 v.y = 0; if (Mathf.Abs(v.z) < 1) //消除手抖影响 v.z = 0; _renderImage.StartRotate(v); } else if (_canPan) { v.y = gesture.delta.y * 0.005f; v.x = gesture.delta.x * 0.005f; //平移 var pos = _renderImage.modelRoot.localPosition; _renderImage.modelRoot.localPosition = new Vector3(pos.x + v.x, pos.y + v.y, pos.z); } } private void OnSwipeEnd(EventContext context) { _renderImage.StopRotate(); } #endregion #region Zoom private void OnFocusIn() { _focus = true; Log.Info("focus true"); } private void OnFocusOut() { _focus = false; Log.Info("focus false"); } private void OnMouseWheel(EventContext context) { if (!_canZoom) return; if (!_focus) return; float delta = context.inputEvent.mouseWheelDelta / Stage.devicePixelRatio; SetZoom(delta * 0.2f); } private void SetZoom(float delta) { var pos = _renderImage.modelRoot.localPosition; var targetZ = pos.z + delta; if (targetZ < _zoomLimit.x) { targetZ = _zoomLimit.x; } else if (targetZ > _zoomLimit.y) { targetZ = _zoomLimit.y; } _renderImage.modelRoot.localPosition = new Vector3(pos.x, pos.y, targetZ); } #endregion } }