您的位置:首页 > 移动开发 > Unity3D

【Unity经验】NGUI物品拖拽物品出现的问题

2016-11-20 13:27 351 查看
使用SIKI视频讲解36_NGUI_开发背包捡起物品的功能,完成物品的累加和新添时候出现的问题

使用代码以及视频出处如下所示



 

 

由于方便起见,物品栏只设置了四个格子

效果如下



当代码如下显示的时候,没有任何问题
using UnityEngine;
using System.Collections;

public class Knapsack : MonoBehaviour {

//存储所有的 物品栏
public GameObject[] cells;

//获取装备列表的名字
public string[] equipmentsName;
public GameObject item;

void Update()
{
//按键模拟,另外一个系统运行
if(Input.GetKeyDown(KeyCode.X))
{
Pickup();
}
}

public void Pickup()
{
int index = Random.Range (0,equipmentsName.Length);
string name = equipmentsName[index];
bool isFind = false;

for(int i=0;i < cells.Length;i++)
{
//判断当前格子有没有物体
if(cells[i].transform.childCount>0)
{
print("childCount"+cells[i].transform.childCount);
//如果有,则 判断当前游戏物品的名字。获得其 物品 脚本的名字
KnapsackItem item = cells[i].GetComponentInChildren<KnapsackItem>();
print("item"+item.sprite.spriteName);
//判断当前游戏物品的名字 跟我们的捡到的名字是否一样
if(item.sprite.spriteName == name )
{
isFind = true;
print("isFind"+isFind);
item.AddCount(1);
break;
}
}
}
if(isFind == false)
{
for(int i=0;i < cells.Length;i++)
{

if(cells[i].transform.childCount == 0)
{
//当前物品栏位置没有物品
//添加捡起来的物品
GameObject go = NGUITools.AddChild(cells[i],item);
go.GetComponent<UISprite>().spriteName = name;
go.transform.localPosition = Vector3.zero;
break;
}
}
}

}//

}

这个循环FOR1在前面
for(int i=0;i < cells.Length;i++)
{
//判断当前格子有没有物体
if(cells[i].transform.childCount>0)
{
//如果有,则 判断当前游戏物品的名字。获得其 物品 脚本的名字
KnapsackItem item = cells[i].GetComponentInChildren<KnapsackItem>();
//判断当前游戏物品的名字 跟我们的捡到的名字是否一样
if(item.sprite.spriteName == name )
{
isFind = true;
item.AddCount(1);
break;
}
}
}

这个循环FOR2在后面
if(isFind == false)
{
for(int i=0;i < cells.Length;i++)
{

if(cells[i].transform.childCount == 0)
{
//当前物品栏位置没有物品
//添加捡起来的物品
GameObject go = NGUITools.AddChild(cells[i],item);
go.GetComponent<UISprite>().spriteName = name;
go.transform.localPosition = Vector3.zero;
break;
}
}
}

是没有问题,当FOR2在FOR1的前面的时候就会出现问题

效果如下



问题在于这两个For循环的运行顺序。

当For2在For1的前面,For2系统运行,如果有其他的格子是空的,格子的子类数量为0,则向格子里面添加1个物体

会导致第二种异常的情况出现。

当For1在For2的前面的时候,这种差异是看不出来的。

优化之后,就没有问题了。
public void Pickup()
{
int index = Random.Range (0,equipmentsName.Length);
string name = equipmentsName[index];
bool isFind = false;

for(int i=0;i < cells.Length;i++)
{
//找到每一个格子,判断是否有物体存在

if(cells[i].transform.childCount>0)
{
//如果有,则 判断当前游戏物品的名字。获得其 物品 脚本的名字
KnapsackItem item = cells[i].GetComponentInChildren<KnapsackItem>();
//判断当前游戏物品的名字 跟我们的捡到的名字是否一样
if(item.sprite.spriteName == name )
{
item.AddCount(1);
break;//这个break的作用是用于跳出循环,即找到了,就退出该循环,等待下一次按键反馈
}
}
else if(cells[i].transform.childCount == 0)
{
//当前物品栏位置没有物品
//添加捡起来的物品
if(isFind == false){
GameObject go = NGUITools.AddChild(cells[i],item);
go.GetComponent<UISprite>().spriteName = name;
go.transform.localPosition = Vector3.zero;
isFind = true;//或者把isFind以及相关代码删除这一行替换为break;
}
}
}

}//

pick函数优化后完整代码如下
public void Pickup()
{
int index = Random.Range (0,equipmentsName.Length);
string name = equipmentsName[index];

for(int i=0;i < cells.Length;i++)
{
if(cells[i].transform.childCount>0)
{
//如果有,则 判断当前游戏物品的名字。获得其 物品 脚本的名字
KnapsackItem item = cells[i].GetComponentInChildren<KnapsackItem>();
//判断当前游戏物品的名字 跟我们的捡到的名字是否一样
if(item.sprite.spriteName == name )
{
item.AddCount(1);
break;//这个break的作用是用于跳出循环,即找到了,就退出该循环,等待下一次按键反馈
}
}
else if(cells[i].transform.childCount == 0)
{
//当前物品栏位置没有物品
//添加捡起来的物品
//判断是否格子为空物体,布尔变量isFind控制只执行一次
GameObject go = NGUITools.AddChild(cells[i],item);
go.GetComponent<UISprite>().spriteName = name;
go.transform.localPosition = Vector3.zero;
break;
}
}

}//

KnapsackItem.cs文件中如果移动拖拽物体到其他地方会出问题,于是优化如下添加了一个

else
{
this.transform.localPosition = Vector3.zero;
}KnapsackItem.cs文件完整如下
using UnityEngine;
using System.Collections;

public class KnapsackItem : UIDragDropItem {

public UISprite sprite;
public UILabel label;
private int count =1;

public void AddCount(int number =1)
{
count += number;
label.text = count + "";
}

protected override void OnDragDropRelease(GameObject surface)
{
//返回的是 拖拽物体 表面的碰撞体,获得物品栏的对象surface
base.OnDragDropRelease (surface);
Debug.Log (surface+"/n");

print (surface.transform.childCount);
if (surface.tag == "Cell") {
this.transform.parent = surface.transform;
//使得其 父类 的局部坐标为0
this.transform.localPosition = Vector3.zero;
}
else if(surface.tag == "Knapsack")
{
//获得其拖拽物体1 要交换物体2的父类
Transform parent = surface.transform.parent;
//使得要交换物体2 的坐标和父类 与 拖拽物体1 交换
surface.transform.parent = this.transform.parent;
surface.transform.localPosition = Vector3.zero;

this.transform.parent = parent;
this.transform.localPosition = Vector3.zero;
}
else
{
this.transform.localPosition = Vector3.zero;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: