using UnityEngine.EventSystems;
using System;
using MessageBoxNS;
using UnityEngine;
using TMPro;
using GunAssembly.Facade;
namespace GunAssembly.View
{
public class GunUIPartItem : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler,
IInitializePotentialDragHandler, IBeginDragHandler, IDragHandler, IEndDragHandler
{
/// <summary>
/// 是否正在拖拽中
/// </summary>
public static bool IsDrag = false;
/// <summary>
/// Q的名字
/// </summary>
public string GunName;
/// <summary>
/// 零件名称
/// </summary>
public TextMeshProUGUI TextMesh;
/// <summary>
/// 零件的说明
/// </summary>
public string PartExplain;
/// <summary>
/// 零件名称
/// </summary>
public string PartName
{
get
{
return TextMesh.text;
}
set
{
TextMesh.text = value;
}
}
/// <summary>
/// 设置该零件是否已经完成
/// </summary>
public bool IsCurrentPartFinish;
/// <summary>
/// 当前零件所属的步骤
/// </summary>
public int CurrentPartStep;
public GunUIView View;
/// <summary>
/// 当前零件的目标对象
/// </summary>
private GameObject TargetObj;
/// <summary>
/// 拖拽对象
/// </summary>
private GameObject ResouceObj;
public void OnPointerEnter(PointerEventData eventData)
{
if (!IsDrag)
{
View.SetGunPartInfo(PartExplain);
}
}
public void OnPointerExit(PointerEventData eventData)
{
if (!IsDrag)
{
View.SetGunPartInfo("");
}
}
public void OnInitializePotentialDrag(PointerEventData eventData)
{
View.SetGunPartInfo(PartExplain);
}
public void OnBeginDrag(PointerEventData eventData)
{
IsDrag = true;
CameraObserve.Instance.CanMove = false;
ResouceObj = CreatDragObj(PartName);
}
public void OnDrag(PointerEventData eventData)
{
if (IsDrag)
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
GameObject gameObj = hit.collider.gameObject;
if (gameObj.name.Equals(PartName) && !IsCurrentPartFinish)
{
IsCurrentPartFinish = true;
OnEndDrag(null);
AppFacade.Instance.SendNotification(Events.Events.UpdateView, this);
}
}
}
}
public void OnEndDrag(PointerEventData eventData)
{
IsDrag = false;
CameraObserve.Instance.CanMove = true;
if (ResouceObj != null) Destroy(ResouceObj);
View.SetGunPartInfo("");
}
/// <summary>
/// 生成预制
/// </summary>
/// <param name="partName"></param>
private GameObject CreatDragObj(string partName)
{
GunModelViewMediator gunModelViewMediator = Facade.AppFacade.Instance.RetrieveMediator(GunModelViewMediator.NAME) as GunModelViewMediator;
TargetObj = gunModelViewMediator.GetGunPart(PartName);
return Instantiate(Resources.Load("Model/Part/" + GunName + "/" + PartName) as GameObject);
}
private void Update()
{
if (IsDrag && ResouceObj != null)
{
float distance = Vector3.Distance(Camera.main.transform.position, TargetObj.transform.position);
Vector3 Pos = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, distance));
ResouceObj.transform.position = Pos;
}
}
}
}
主要逻辑还是在OnDrag里边