博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unity3D NGUI 基于UIDraggablePanel实现滑动窗体,带位置图标
阅读量:6564 次
发布时间:2019-06-24

本文共 5101 字,大约阅读时间需要 17 分钟。

  hot3.png

  最近由于工作需要学习UNITY3D,对于做PHP的程序猿挑战性灰常大,unity3D国内相关资料少得可怜唉!

根据需求做个防“天天爱消除”主界面左右滑动窗体的效果,百度搜到雨凇大神的一个帖子

不过效果不怎么理想,没有平滑的spring动画。研究NGUI自带的Example 7 - Scroll View (Panel) 例子

实现了如下效果:

UIDragSlider.cs: 该脚本扩展了UICenterOnChild.CS的功能!用于灰白点队列的初始化工作以及根据最近中心点的窗体下标控制白点显示的位置。

UIDragSlider.cs

using UnityEngine;/// /// Ever wanted to be able to auto-center on an object within a draggable panel?/// Attach this script to the container that has the objects to center on as its children./// //[AddComponentMenu("NGUI/Interaction/Center On Child")]public class UIDragSlider : MonoBehaviour{	/// 	/// The strength of the spring.	/// 	public float springStrength = 8f;	/// 	/// Callback to be triggered when the centering operation completes.	/// 	public SpringPanel.OnFinished onFinished;		//用来放置灰色、白色小点	public Transform  ponit;	//白色的小点	public GameObject prefabMaskDot;	//灰色的小点	public GameObject prefabBaseDot;	//白色小点的临时对象	private GameObject maskDot;	//灰色、白色小点下方的起始位置。	int start;	UIDraggablePanel mDrag;	GameObject mCenteredObject;	/// 	/// Game object that the draggable panel is currently centered on.	/// 	public GameObject centeredObject { get { return mCenteredObject; } }	void OnEnable ()	{		Recenter ();		//initSlider ();	}	void Start ()	{		initSlider ();	}	void OnDragFinished ()	{		if (enabled)			Recenter ();	}	/// 	/// Recenter the draggable list on the center-most child.	/// 	public void Recenter ()	{			if (mDrag == null) {			mDrag = NGUITools.FindInParents
(gameObject); //mDrag = GameObject.Find("UIPanel (Clipped View)").GetComponent
(); if (mDrag == null) { Debug.LogWarning (GetType () + " requires " + typeof(UIDraggablePanel) + " on a parent object in order to work", this); enabled = false; return; } else { //mDrag = mDrag.GetComponent
(); mDrag.onDragFinished = OnDragFinished; //Debug.Log(mDrag.panel); if (mDrag.horizontalScrollBar != null) mDrag.horizontalScrollBar.onDragFinished = OnDragFinished; if (mDrag.verticalScrollBar != null) mDrag.verticalScrollBar.onDragFinished = OnDragFinished; } } if (mDrag.panel == null) return; // Calculate the panel's center in world coordinates Vector4 clip = mDrag.panel.clipRange; Transform dt = mDrag.panel.cachedTransform; Vector3 center = dt.localPosition; center.x += clip.x; center.y += clip.y; center = dt.parent.TransformPoint (center); // Offset this value by the momentum Vector3 offsetCenter = center - mDrag.currentMomentum * (mDrag.momentumAmount * 0.1f); mDrag.currentMomentum = Vector3.zero; float min = float.MaxValue; Transform closest = null; Transform trans = transform; // Determine the closest child for (int i = 0, imax = trans.childCount; i < imax; ++i) { Transform t = trans.GetChild (i); float sqrDist = Vector3.SqrMagnitude (t.position - offsetCenter); if (sqrDist < min) { min = sqrDist; closest = t; } } if (closest != null) { Debug.Log (closest.gameObject.name); mCenteredObject = closest.gameObject; // Figure out the difference between the chosen child and the panel's center in local coordinates Vector3 cp = dt.InverseTransformPoint (closest.position); Vector3 cc = dt.InverseTransformPoint (center); Vector3 offset = cp - cc; // Offset shouldn't occur if blocked by a zeroed-out scale if (mDrag.scale.x == 0f) offset.x = 0f; if (mDrag.scale.y == 0f) offset.y = 0f; if (mDrag.scale.z == 0f) offset.z = 0f; // Spring the panel to this calculated position SpringPanel.Begin (mDrag.gameObject, dt.localPosition - offset, springStrength).onFinished = onFinished; //两个方法一个设置名字 //获取当前下标 /* int index=0; foreach(Transform child in transform){ if(child.gameObject==closest.gameObject){ Debug.Log("index:"+index); setMaskPos(index); } index++; } */ //第二个方法需要命名 string[] indexName = closest.gameObject.name.Split ('_'); setMaskPos (int.Parse (indexName [1])); } else mCenteredObject = null; } void initSlider () { //因为下方灰色 白色的小点需要根据相册列表的数量来计算居中显示 int size = transform.childCount; //乘以16表示计算所有小点加起来的宽度 int length = (size - 1) * 17; //得到下方灰色 白色 小点的居中起始位置 start = (-length) >> 1; for (int i=0; i< size; i++) { //把每一个灰色小点加入3D世界 GameObject hui = (GameObject)Instantiate (prefabBaseDot); //设置灰色小点的父类为另外一个面板 hui.transform.parent = ponit; //设置每一个灰色小点的位置与缩放,总之让它们居中排列显示在相册列表下方。 hui.transform.localPosition = new Vector3 (start + i * 24, -240f, 0f); hui.transform.localScale = new Vector3 (17, 17, 1); //深度 因为是先在屏幕下方绘制4个灰色的小点, 然后在灰色上面绘制白色小点 //表示当前的窗口ID 所以深度是为了设置白色小点在灰色小点之上绘制 hui.GetComponent
().depth = 0; } //把白色小点也加载在3D世界中 maskDot = (GameObject)Instantiate (prefabMaskDot); //设置它的深度高于 灰色小点,让白色小点显示在灰色小点之上 maskDot.GetComponent
().depth = 1; //设置白色小点的开始位置 setMaskPos (0); } void setMaskPos (int index) { maskDot.transform.parent = ponit; maskDot.transform.localPosition = new Vector3 (start + index * 24, -240f, -10f); maskDot.transform.localScale = new Vector3 (17, 17, 1); }}
把脚本加到UIGrid上面

如有疑问请站内

转载于:https://my.oschina.net/sior/blog/153494

你可能感兴趣的文章
leetcode中级管理
查看>>
软件项目版本号的命名规则、格式介绍及管理策略
查看>>
UVA - 1599 Ideal Path (一遍树上BFS)
查看>>
oracle提交commit后回退恢复
查看>>
序列化与反序列化总结(Serializable和Parcelable)
查看>>
iOS开发-观察者模式
查看>>
ios block一定会犯的几个错误
查看>>
ecshop自动确认收货(无其他商家)
查看>>
开源软件下载站
查看>>
3. Configure the Identity Service
查看>>
.NET WebForm 简介
查看>>
Git 常用命令
查看>>
决定undo表空间的大小
查看>>
前沿技术解密——VirtualDOM
查看>>
jvm调优
查看>>
Leetcode系列-Search in Rotated Sorted Array
查看>>
matlab对图像加入噪声的方法
查看>>
html转图片
查看>>
num 26
查看>>
主机名
查看>>