【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;
}
}
}
使用代码以及视频出处如下所示
由于方便起见,物品栏只设置了四个格子
效果如下
当代码如下显示的时候,没有任何问题
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;
}
}
}
相关文章推荐
- Unity5.4.1与NGUI出现的问题Ignoring menu item NGUI because it is in no submenu!
- 【Unity&NGUI】背包拖拽问题&物体穿透
- Unity5.4.1与NGUI出现的问题Ignoring menu item NGUI because it is in no submenu!
- 【Unity】NGUI出现的问题,Popup List下拉菜单问题
- 【unity】【NGUI】当把挂在比如UILabel之类NGUI组件的对象对象池化的时候,出现各种问题的原因分析
- Unity5.4.1与NGUI出现的问题Ignoring menu item NGUI because it is in no submenu!
- [Unity]背包效果-使用NGUI实现物品的拖拽效果Drag
- Unity NGUI UILabel文字变色 及相关问题
- Unity中使用NGUI和FingerGestures插件点击UI穿透的问题
- Unity 3d 使用NGUI做UI时遇到的奇怪问题
- unity调用Android通过编译 java jar包出现问题解决和简单支付流程
- Unity导入NGUI遇到的问题
- Unity 粒子特效被NGUI遮挡的问题
- [经验]在Windows Server上安装Metasploit Framework 3.7.1出现问题及解决方法
- unity中使用自定义shader进行光照贴图烘培无法出现透明度的坑爹问题
- 使用NGUI的UIListener 和UIEvent Trigger 中的 OnDouble-Click 出现问题
- NGUI在Unity中因更改窗口区域而出现Bug的处理
- [Android]语音识别中出现的问题和经验
- 解决Unity中,使用Ngui 的默认字体Arial,在部分Android设备显示中文不清楚,或者显示不出来问题
- 【经验】photoshop cs4]打开动态GIF图出现的一些问题及解决方法