public class CustomMeshCollision : Image
{
//重写IsRaycastLocationValid方法,定义新的事件响应区域
public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
{
//return base.IsRaycastLocationValid(screenPoint, eventCamera);
return GetComponent<PolygonCollider2D>().OverlapPoint(screenPoint);
}
}
public class EventDemo : MonoBehaviour, IPointerClickHandler,IDragHandler
{
public void Fun1()
{
Debug.Log("Fun1");
}
public void Fun2(string str)
{
Debug.Log("Fun2:" + str);
}
private void Start1()
{
//事件:当满足某种条件自动调用方法的过程。
//注册事件:将某个方法与某个事件做关联。
//1.获取相关组件引用
Button btn = transform.Find("Button").GetComponent<Button>();
//2.绑定
//public delegate void UnityAction();
//方法形参:委托类型
//方法实参:传递方法(无返回值,无参数)
btn.onClick.AddListener(Fun1);
var input = transform.Find("InputField").GetComponent<InputField>();
//public delegate void UnityAction<T0>(T0 arg0);
//传递无返回值,1个参数的方法
input.onValueChanged.AddListener(Fun2);
}
//光标单击当前UI时执行
public void OnPointerClick(PointerEventData eventData)
{
//eventData 事件参数类:包含了引发事件时的信息
//判断单击次数
if (eventData.clickCount == 2)
{
Debug.Log("OnPointerClick");
}
}
//光标拖拽当前UI时执行
public void OnDrag(PointerEventData eventData)
{
//当canvas渲染模式为overlay时,世界坐标原点与屏幕坐标原点重合,
//所以可以将屏幕坐标视为世界坐标
//获取当前光标位置(屏幕)
//transform.position = eventData.position;
//通用拖拽代码
Vector3 worldPos;
RectTransform parentRTF = transform.parent as RectTransform;
//将屏幕坐标 --> 世界坐标
RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.pressEventCamera, out worldPos);
transform.position = worldPos;
//练习:精准拖拽
}
}
public class ItweenDemo : MonoBehaviour
{
public iTween.EaseType type;
public GameObject targetTF;
public void ItweenMovement()
{
//iTween.MoveTo(targetTF, transform.position, 1);
//缓动插件 DoTween
iTween.MoveTo(targetTF, iTween.Hash(
"position", transform.position,
"time", 1,
"easetype", type,
"oncomplete", "Fun1",
"oncompletetarget",gameObject
));
}
//动画事件
private void Fun1()
{
print("到了");
}
}
public class RectTransformDemo : MonoBehaviour
{
public Vector3 localPos;
public Vector2 size;
private void Update()
{
//UI 世界坐标(从世界原点 指向 UI 轴心点Pivot向量)
Vector3 worldPos = transform.position;
//当前UI轴心点 相对于 父级(UI)轴心点 向量
//从父级轴心点 指向 当前UI轴心点 向量
localPos = transform.localPosition;
//RectTransform rtf = transform as RectTransform;
RectTransform rtf = GetComponent<RectTransform>();
//当前UI 锚点 指向 轴心点的向量
Vector3 anchoredPos = rtf.anchoredPosition3D;
//获取3D模型大小
//Vector3 size = GetComponent<MeshRenderer>().bounds.size;
//获取UI宽高
float width = rtf.rect.width;
float height = rtf.rect.height;
////设置UI宽度
//rtf.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 100);
////设置UI高度
//rtf.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 100);
//rtf.sizeDelta = new Vector2(100, 100);
//当前物体大小 - 锚点大小
//如果锚点不分开,结果是物体大小
size = rtf.sizeDelta;
//RectTransformUtility
}
}
public class SilderPanel : MonoBehaviour,IDragHandler,IEndDragHandler,IBeginDragHandler
{
[Tooltip("拖拽速度")]
public float dragSpeed = 30;
private Transform[] childArrayTF;
private void Start()
{
//将所有子物体(亲儿子)变换组件存储到数组中
childArrayTF = new Transform[transform.childCount];
for (int i = 0; i < childArrayTF.Length; i++)
{
childArrayTF[i] = transform.GetChild(i);
}
}
public void OnDrag(PointerEventData eventData)
{
//当前光标位置 - 上一帧光标位置
//print(eventData.delta);
transform.Translate(eventData.delta.x * Time.deltaTime * dragSpeed, 0, 0);
}
//开始拖拽位置
private Vector2 beginPoint;
//开始拖拽
public void OnBeginDrag(PointerEventData eventData)
{
beginPoint = eventData.position;
}
[Tooltip("滑动速度阈值")]
public float silderSpeedThreshold = 5;
public int index;
private Vector2 beginPos, endPos;
//结束拖拽时执行
public void OnEndDrag(PointerEventData eventData)
{
Vector2 dragOffset = eventData.position - beginPoint;
//更换页面条件:光标移动距离、速度
if (dragOffset.magnitude > Screen.width / 2 || Mathf.Abs(eventData.delta.x) > silderSpeedThreshold)
{
//如果光标向左移动 则页码增加
if (dragOffset.x < 0)
//计算页码
index++;
else
index--;
//限制页码范围
index = Mathf.Clamp(index, 0, transform.childCount - 1);
}
//transform.position = endPos;
beginPos = transform.position;
//公式:父UI位置 - 需要呈现页面位置 + 当前物体位置
endPos = transform.parent.position - childArrayTF[index].position + transform.position;
x = 0;
}
public AnimationCurve curve;
private float x = 1;
[Tooltip("滑动持续时间")]
public float duration = 0.5f;
private void Update()
{
if (x < 1)
{
x += Time.deltaTime / duration;
//起点固定 终点固定 比例变化
transform.position = Vector3.Lerp(beginPos, endPos, curve.Evaluate(x));
}
}
}
/*
需求分析:
1.面板跟随光标移动方向(左右 eventData.delta )移动 transform.Translate(?,0,0)
2.松开归位
-- 确定事件
-- 更换页面条件:光标移动距离、速度
-- 计算页码
-- 如何呈现指定页面(计算当前物体SilderPanel需要移动的位置)
-- 移动
*
* 全屏滑动:
* 创建 SilderPanel (四个锚点分开)作为所有页面的父物体
* 创建子页面Panel
*
* 小屏滑动:
* 创建 PanelView(Panel) 作为呈现范围,添加Mask组件,用于遮盖范围外的UI元素。
* 将SilderPanel添加至PanelView中
*/
/*
作业:实现2048用户的输入
*
*/
/// <summary>
/// UI拖拽
/// </summary>
public class UIDrag : MonoBehaviour,IPointerDownHandler,IDragHandler
{
private RectTransform parentRTF;
private void Start()
{
parentRTF = transform.parent as RectTransform;
}
private Vector3 downOffset;
//光标按下时执行
public void OnPointerDown(PointerEventData eventData)
{
//记录偏移位置
//屏幕坐标 eventData.position --> 世界坐标 downWorldPos
Vector3 downWorldPos;
RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.pressEventCamera, out downWorldPos);
downOffset = transform.position - downWorldPos;
}
public void OnDrag(PointerEventData eventData)
{
Vector3 currentWorldPos;
RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.pressEventCamera, out currentWorldPos);
//拖拽时,在当前光标位置基础上 + 按下时记录的偏移量
transform.position = currentWorldPos + downOffset;
}
}