您的位置:首页 > 产品设计 > UI/UE

基于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);
}
}




 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息