千家信息网

UnityUI如何实现拖拽模型选择功能

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,小编给大家分享一下UnityUI如何实现拖拽模型选择功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!指定一块区域,玩家鼠
千家信息网最后更新 2026年11月01日UnityUI如何实现拖拽模型选择功能

小编给大家分享一下UnityUI如何实现拖拽模型选择功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

指定一块区域,玩家鼠标or手指拖拽这个区域,模型会进行偏移,并用于进行人物、道具的选择

给模型定义一些属性

using System.Collections;using System.Collections.Generic;using UnityEngine;public class UIModelUtil : MonoBehaviour{ public Animator animator; public int id; public int index;}

模型控制

using System.Collections;using System.Collections.Generic;using UnityEngine;public class UIModelControl : MonoBehaviour{ public Transform modelsParent; public Transform centerPos; public float interval; public bool loop; List models; bool isPressing; public UIDrag dragComp; Vector3 mousePos; private void Awake() { if(models == null) { int i = 0; models = new List(); foreach(UIModelUtil util in modelsParent.GetComponentsInChildren()) { models.Add(util); //util.index = i; Vector3 pos = Vector3.zero; pos.x = i * interval; util.transform.localPosition = pos; i++; } } } private void Start() { JumpToSelect(); } private void Update() { //接受拖拽事件 if (isPressing) { float x = GetInputDeltaX(); int dir = 0; if (x > 0) dir = 1; else if (x < 0) dir = -1; //分辨率修正 if (dir == 0) return; x = Mathf.Abs(x) / (Screen.width) * 800f; if (x > 800f) x = 800f; //偏移 float currectX = Mathf.Lerp(0, interval, x / 800f) * dir; Vector3 pos = modelsParent.position; pos.x += currectX; Transform right = GetRight().transform; Transform left = GetLeft().transform; //不循环时候设置边框 if (models.Count > 2 || !loop || models.Count == 1) { if (right.localPosition.x + interval / 10 < -pos.x) pos.x = -(right.localPosition.x + interval / 10); else if (left.localPosition.x - interval / 10 > -pos.x) pos.x = -(left.localPosition.x - interval / 10); //modelsParent.position = pos; } //只有两个循环的时候 else if (models.Count == 2 && loop) { Transform selected = GetSelect().transform; //当前是右边那个且向右拖拽 if (selected == right && dir < 0) { Vector3 leftPos = left.localPosition; leftPos.x = right.localPosition.x + interval; left.localPosition = leftPos; } //当前是左边那个且向左拖拽 else if (selected == left && dir > 0) { Vector3 rightPos = right.localPosition; rightPos.x = left.localPosition.x - interval; right.localPosition = rightPos; } } modelsParent.position = pos; AfterSelect(); } } void AfterSelect() { foreach(UIModelUtil util in models) { float dis = GetXDis(util); //设置显示 if (dis > interval) util.gameObject.SetActive(false); else { //越靠近中间越前 util.gameObject.SetActive(true); float t = Mathf.Abs(dis) / interval; float y = Mathf.Lerp(centerPos.position.z, modelsParent.position.z, t); Vector3 pos = util.transform.position; pos.z = y; util.transform.position = pos; } } //循环时候位置修正 if (loop && models.Count > 2) { Transform right = GetRight().transform; Transform left = GetLeft().transform; Transform selected = GetSelect().transform; if (selected == right) { Vector3 pos = right.position; pos.x += interval; left.position = pos; } else if (selected == left) { Vector3 pos = left.position; pos.x -= interval; right.position = pos; } } //设置UI选中状况 dragComp.OnSelected(GetSelect().id, GetSelect().index); } //通过id选中 UIModelUtil GetById(int id) { if (models == null) return null; UIModelUtil target = null; foreach (UIModelUtil util in models) { if (util.id == id) return util; } return target; } //获取当前选中 UIModelUtil GetSelect() { if (models == null) return null; float min = 9999; UIModelUtil target = null; foreach(UIModelUtil util in models) { float dis = Mathf.Abs( GetXDis(util)); if(dis < min) { target = util; min = dis; } } return target; } //所有模型最右边的那个 UIModelUtil GetRight() { if (models == null) return null; float max = -9999; UIModelUtil target = null; foreach(UIModelUtil util in models) { float dis = util.transform.localPosition.x; if(dis > max) { target = util; max = dis; } } return target; } //所有模型最左边的那个 UIModelUtil GetLeft() { if (models == null) return null; float min = 9999; UIModelUtil target = null; foreach(UIModelUtil util in models) { float dis = util.transform.localPosition.x; if(dis < min) { target = util; min = dis; } } return target; } //UI控件按下触发 public void OnPress() { if (isPressing) return; isPressing = true; if (Application.isEditor) mousePos = Input.mousePosition; else mousePos = Input.GetTouch(0).position; if (backing != null) StopCoroutine(backing); } //UI控件释放触发 public void OnRelease() { backing = StartCoroutine(ToSelect()); isPressing = false; } Coroutine backing; //释放后偏移 IEnumerator ToSelect() { UIModelUtil selected = GetSelect(); float dis = GetXDis(selected); float time = Mathf.Lerp (0, 1f, Mathf.Abs(dis) / interval); float timer = 0; Vector3 from = modelsParent.localPosition; Vector3 to = from; to.x = -selected.transform.localPosition.x; while(timer < time) { timer += Time.deltaTime; float t = timer / time; Vector3 pos = Vector3.Lerp(from, to, t); modelsParent.localPosition = pos; AfterSelect(); yield return null; } backing = null; } //获取手指偏移量 float GetInputDeltaX() { Vector3 pos; if (Application.isEditor) pos = Input.mousePosition; else pos = Input.GetTouch(0).position; Vector3 delta = pos - mousePos; //Debug.Log(pos +"/"+mousePos +"/"+ delta.x); mousePos = pos; return delta.x; } //计算偏移中心位置的X轴距离 float GetXDis(UIModelUtil util) { return util.transform.position.x - centerPos.position.x; } // 跳转到选中的id public void JumpToSelect() { int id = CharacterManager.characterId; Vector3 pos = modelsParent.localPosition; UIModelUtil selected = GetById(id); pos.x = -selected.transform.localPosition.x; modelsParent.localPosition = pos; AfterSelect(); }}

UI接受点击事件:

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.EventSystems;public class UIDrag : MonoBehaviour,IPointerDownHandler, IPointerUpHandler{ public UIModelControl control; virtual public void OnPointerDown(PointerEventData data) { control.OnPress(); } virtual public void OnPointerUp(PointerEventData data) { control.OnRelease(); } virtual public void OnSelected(int id, int index) { }}

以上是"UnityUI如何实现拖拽模型选择功能"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

模型 偏移 选择 时候 篇文章 循环 功能 事件 位置 内容 区域 手指 控件 不怎么 两个 人物 只有 右边 大部分 属性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳市人人互联网科技有限公司 互联网科技巨头监管 科技互联网技术 科技类互联网 互联网络科技有限公司 互联网医疗科技 以房互联网科技 互联网金融监管科技 互联网科技素材视频竖屏 山东吉时兔互联网科技有限公司 西藏七维空间互联网科技有限公司 福州新华互联网科技学校 知乎 贵州叶脉互联网科技有限公司所属行业 湖南一路畅行互联网科技 互联网科技产业特征 想开互联网科技公司怎么样 锡山区互联网智能科技产品供应 恒生科技指数 中概互联网 北京品多多互联网科技有限公司 小牛互联网科技有限公司地址 保险科技 互联网保险 互联网科技工作委员会 互联网科技工作委员会主任 万易互联网科技有限公司 成都仁贤领冠互联网科技有限公司 昭通互联网科技选哪家 城市宝互联网科技有限公司 上海创道互联网络科技有限公司 互联网企业和网络科技有限公司 如何强化互联网金融科技
0