基于NGUI的背包管理系统之物体拖拽DEMO
2013-11-25 14:42
337 查看
using UnityEngine; using System.Collections; public class DragAndDrop : MonoBehaviour { public Camera mCamera; Vector3 mScreenPosition; Vector3 offset ; GameObject Target; bool isDrop = false; void OnDrag() { Vector3 curMousePostion = new Vector3(Input.mousePosition.x, Input.mousePosition.y, mScreenPosition.z); Target.transform.position = offset + mCamera.ScreenToWorldPoint(curMousePostion); } void OnPress(bool isDown) { if (isDown) { Target = this.transform.FindChild("Texture").gameObject; mScreenPosition = Target.transform.position; Vector3 mMousePostion = new Vector3(Input.mousePosition.x, Input.mousePosition.y, mScreenPosition.z); offset = mScreenPosition - mCamera.ScreenToWorldPoint(mMousePostion); isDrop = false; } else { if (!isDrop) { //没有拖拽到Collider中则回到原来位置 Target.transform.position = new Vector3(mScreenPosition.x, mScreenPosition.y, mScreenPosition.z); } } } void OnDrop(GameObject go) { DragAndDrop obj = go.GetComponent<DragAndDrop>(); obj.isDrop = true; //移动物体到当前对象下 go.transform.FindChild("Texture").parent = this.transform; //重置物体坐标 this.transform.FindChild("Texture").localPosition = new Vector3(0, 0, -1); } }
NGUI结构
自己做的一个小例子,没有很规范的背包图片。就添加了几个Sprite作为小格子。实现思路:
1.鼠标按下获得当前位置信息,并保存。2.拖拽后判断是否进入Collider,如果进入则将Object赋值给新Item。并且LocalPostion重置。如果鼠标抬起后未进入,则还原位置。
==================================================================================================================
==================================================================================================================
背包代码改进,比上面的更丰富。
背包类using UnityEngine; using System.Collections; using System.Collections.Generic; public class MyPackItemStorage : MonoBehaviour { //每个小格子模型 public GameObject template; public int maxItemCount = 16; public int maxRows = 4; public int maxColumns = 4; public int spacing = 128; public int padding = 10; List<string> mItems = new List<string>(); public List<string> items { get { while (mItems.Count < maxItemCount) mItems.Add(null); return mItems; } } //交换位置 public string Replace(int index, string textureName) { if (index < maxItemCount) { string s = items[index]; mItems[index] = textureName; return s; } return textureName; } public string GetItems(int index) { return (index < items.Count) ? items[index] : null; } // Use this for initialization void Start () { if(template != null) { int count = 0; for(int y = 0 ; y < maxRows ; y++) { for (int x = 0; x < maxColumns; x++) { //添加prefab,并调整位置 GameObject go = NGUITools.AddChild(gameObject, template); go.transform.localPosition = new Vector3(padding + x * spacing, -padding - y * spacing, 0f); MyUIItemSlot slot = go.GetComponent<MyUIItemSlot>(); if (slot != null) { slot.stor = this; slot.num = count; } UISprite slotSprite = slot.transform.FindChild("Icon").GetComponent<UISprite>(); string spriteName = slotSprite.spriteName; if (y == 1) { spriteName = "Orc Armor - Boots"; //添加不同的图片。便于测试 } if (slotSprite != null && slotSprite.enabled) { mItems.Add(spriteName); } else mItems.Add(null); count++; } } } } }
背包项
using UnityEngine; using System.Collections; public class MyUIItemSlot : MonoBehaviour { public MyPackItemStorage stor; public UISprite icon; public int num = 0; static int i = 0; static string mDraggedItem; //当前被点拾起的物品 string curItem;//当前格子上的物品 public string Replace(string go) { string mItem = stor.Replace(num, go); return mItem; } public string getItem { get { return stor.GetItems(num); } } void OnClick() { if (mDraggedItem != null) { OnDrop(null); } else if (curItem != null) { mDraggedItem = Replace(null); UpdateCursor(); } } void OnDrop(GameObject go) { string item = Replace(mDraggedItem); mDraggedItem = item; UpdateCursor(); } void OnDrag(Vector3 delta) { if (mDraggedItem == null && curItem != null) { UICamera.currentTouch.clickNotification = UICamera.ClickNotification.BasedOnDelta; mDraggedItem = Replace(null); UpdateCursor(); } } void UpdateCursor() { if (mDraggedItem != null) MyUICursor.Set(icon.atlas, mDraggedItem); else MyUICursor.Clear(); } // Use this for initialization void Start () { Debug.Log("start"); } // Update is called once per frame void Update () { string s = getItem; if (curItem != s) { curItem = s; if(curItem == null) { icon.enabled = false; }else if (icon!=null) { icon.spriteName = curItem; icon.enabled = true; icon.MakePixelPerfect(); } } } }
鼠标控制操作
using UnityEngine; using System.Collections; public class MyUICursor : MonoBehaviour { static MyUICursor mInstance; public Camera mCamera; Transform mTransform; UISprite mSprite; UIAtlas mSpriteAtlas; string mSpriteName; void Awake() { mInstance = this; } void OnDestroy() { mInstance = null; } // Use this for initialization void Start () { mTransform = this.transform; mSprite = gameObject.transform.GetComponentInChildren<UISprite>(); mSpriteAtlas = mSprite.atlas; mSpriteName = mSprite.spriteName; mSprite.depth = 100; } // Update is called once per frame void Update () { if (mSprite.atlas != null) { Vector3 pos = Input.mousePosition; if (mCamera != null) { pos.x = Mathf.Clamp01(pos.x / Screen.width); pos.y = Mathf.Clamp01(pos.y / Screen.height); mTransform.position = mCamera.ViewportToWorldPoint(pos); if (mCamera.isOrthoGraphic) { mTransform.localPosition = NGUIMath.ApplyHalfPixelOffset(mTransform.localPosition, mTransform.localScale); } } } } static public void Set(UIAtlas atlas , string name) { if(mInstance != null) { mInstance.mSprite.atlas = atlas; mInstance.mSprite.spriteName = name; mInstance.mSprite.MakePixelPerfect(); mInstance.Update(); } } static public void Clear() { Set(mInstance.mSpriteAtlas, mInstance.mSpriteName); } }
相关文章推荐
- 我们的游戏世界(背包【仓库】,交易,任务,简单经济系统,装备)实现(基于仙剑demo聊聊游戏世界)第三篇谈谈装备
- NGUI之设置背包系统里面的物品的可拖拽功能
- 基于WebForm+EasyUI的业务管理系统形成之旅 -- 首页Portal界面拖拽(Ⅵ)
- NGUI 背包系统的拖拽
- unity背包系统中物体拖拽效果实现(初学者)
- 我们的游戏世界(背包【仓库】,交易,任务,简单经济系统,装备)实现(基于仙剑demo聊聊游戏世界)第一篇谈谈交易
- 【Unity&NGUI】背包拖拽问题&物体穿透
- 我们的游戏世界(背包【仓库】,交易,任务,简单经济系统,装备)实现(基于仙剑demo聊聊游戏世界)第四篇谈谈背包
- NGUI 背包系统的拖拽
- 我们的游戏世界(背包【仓库】,交易,任务,简单经济系统,装备)实现(基于仙剑demo聊聊游戏世界)第二篇谈谈任务
- 基于数据库MySQL的简易学生信息管理系统
- 基于RFID的智能旅游CY-RAT-101/102游客管理系统
- 基于SSH商场管理系统
- 基于Java的门户网站管理系统——JEECMS源码版的搭建步骤
- 基于报表系统的的企业数据管理
- 基于Android的移动图书馆管理系统
- 基于UML和ASP.NET实现三层B/S学生管理系统开发
- 基于rbac设计的权限管理系统
- 基于plusgantt的项目管理系统实战开发
- 基于SSH的员工管理系统(二)——lib详解