196 lines
5.7 KiB
C#
196 lines
5.7 KiB
C#
// 本脚本只在不存在时会生成一次。组件逻辑写在当前脚本内。已存在不会再次生成覆盖
|
|
|
|
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 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();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 加载资产模型
|
|
/// </summary>
|
|
/// <param name="configId"></param>
|
|
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<CCDIK>();
|
|
if (ccdIk != null)
|
|
{
|
|
Object.Destroy(ccdIk);
|
|
}
|
|
|
|
var lineRenderer = model.GetComponent<LineRenderer>();
|
|
if (lineRenderer != null)
|
|
{
|
|
Object.Destroy(lineRenderer);
|
|
}
|
|
|
|
var rigidbody = model.GetComponent<Rigidbody>();
|
|
if (rigidbody != null)
|
|
{
|
|
rigidbody.isKinematic = true;
|
|
}
|
|
|
|
|
|
_renderImage.SetModel(model);
|
|
_renderImage.modelRoot.localScale = Vector3.one;
|
|
|
|
var previewableAsset = model.GetComponent<PreviewableAsset>();
|
|
if (previewableAsset != null)
|
|
{
|
|
_zoomLimit = previewableAsset.zoom;
|
|
_panLimit = previewableAsset.pan;
|
|
model.transform.localPosition = previewableAsset.position;
|
|
model.transform.localScale = previewableAsset.scale;
|
|
model.transform.localRotation = Quaternion.Euler(previewableAsset.rotation);
|
|
}
|
|
else
|
|
{
|
|
_zoomLimit = Vector3.zero;
|
|
_panLimit = Rect.zero;
|
|
model.transform.localPosition = previewableAsset.position;
|
|
model.transform.localScale = Vector3.one;
|
|
model.transform.localRotation = Quaternion.Euler(Vector3.zero);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 加载角色模型
|
|
/// </summary>
|
|
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
|
|
{
|
|
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 (!_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
|
|
}
|
|
} |