背包_InventoryGrid

本文介绍了一个基于Unity的游戏背包UI系统的实现细节,包括如何通过脚本控制背包界面的显示与隐藏,以及物品槽位的交互逻辑。展示了如何利用GUI系统绘制背包界面,并实现了物品图标显示及拖拽操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

var bagName:String = "set a name for bag";
var bagBtnName:String = "Bag button name here";
var posBagBtn:Vector2 = Vector2(50,50);

var slotSize: float = 40;
var spacingBetweenSlots :float = 5;
var defaultTextureSlot:Texture;
var bagNumber:int;

private var numSlot = 16;
private var offsetBag : int ;
private var showBag :boolean = false;
private var bagPos:Vector2 ;
private var indexOnController:int;

private var tempTexture :Texture;

private var ctrl:PositionController;

function Start()
{
   offsetBag = bagNumber * numSlot;
  ctrl = transform.parent.GetComponent(PositionController);
  indexOnController = 0;
}

 

function OnGUI()
{
   if(GUI.Button(Rect(Screen.width - posBagBtn.x, Screen.height - posBagBtn.y,slotSize,slotSize),bagBtnName))
   {
      ToggleBag();
   }
  
   if(showBag)
   {
     Bag(bagPos.x,bagPos.y,185,200);
   }
}

function ToggleBag()
{
   if(showBag)
   {
     HideBag();
   }
   else
   {
     ShowBag();
   }
}

function HideBag()
{
  showBag = false;
  ctrl.FreePosition(indexOnController);
}

function ShowBag()
{
  showBag = true;
  var info: Vector3 = ctrl.GetPositionAvailable();
  indexOnController = info.z;
  bagPos = Vector2(info.x,info.y);
}

function BagIsBeingDisplayed()
{
   return showBag;
}

function Bag(posX:float,posY:float,sX:float,sY:float)
{
  GUI.BeginGroup(Rect(Screen.width - posX,Screen.height - posY,sX,sY));
  GUI.Box(Rect(0,0,sX,sY),bagName);
 
  for(var i=0;i<4;i++)
  {
     for(var j=0;j<4;j++)
     {
        if(ctrl.GetObjectsInBag(offsetBag + (4*i)+j) == null)
        {
           tempTexture = defaultTextureSlot; 
  } 
  else
  {
   tempTexture = ctrl.GetObjectsInBag(offsetBag+(4*i)+j).GetComponent(ObjectInfo).iconTexture;
  }
  
  if(Input.GetMouseButtonDown(0))
  {
      ctrl.SetButtonClicked(false);
  }
  
        if(GUI.Button(Rect(slotSize*j+spacingBetweenSlots*(j+1) , slotSize*i+spacingBetweenSlots*(i+1)+15,
        slotSize,slotSize),tempTexture))
        {
      ctrl.SetButtonClicked(true);
               
           if(ctrl.GetObjectsInBag(offsetBag+(4*i)+j) != null)
     {
        ctrl.mouseTextureHander.SetCursor(ctrl.GetObjectsInBag(offsetBag+(4*i)+j).GetComponent(ObjectInfo).iconTexture);
    
     ctrl.SetObjAttached(true);
     }
     //print((offsetBag+(4*i)+j));
     //print(ctrl.GetObjectsInBag((offsetBag+(4*i)+j)));
      MoveSlot((offsetBag+(4*i)+j));
        }
     }  
  }
 
  GUI.EndGroup(); 
}

function MoveSlot( indSlot : int)
{
    //ctrl.SetLastSlotUsed(indSlot);
    if(ctrl.GetObjectsInBag(indSlot) == null && !ctrl.GetSlotMovedFlag())//移动图标到新的位置
    {
  ctrl.SetObjectInBag(indSlot, ctrl.GetObjectsInBag(ctrl.GetLastSlotUsed()));
  ReleaseSlot(ctrl.GetLastSlotUsed());
  ctrl.SetSlotMovedFlag(true);
  ctrl.mouseTextureHander.ReleaseCursorIcon();
  ctrl.SetObjAttached(false);
 }
 else if(ctrl.GetObjectsInBag(indSlot) != null && ctrl.GetObjectsInBag(ctrl.GetLastSlotUsed()) != null && !ctrl.GetSlotMovedFlag()) //转换两个图标
 {
     var tmpObj : GameObject = ctrl.GetObjectsInBag(indSlot);
  ctrl.SetObjectInBag(indSlot, ctrl.GetObjectsInBag(ctrl.GetLastSlotUsed()));
  ctrl.SetObjectInBag(ctrl.GetLastSlotUsed(),tmpObj);
  ctrl.SetSlotMovedFlag(true);
  ctrl.mouseTextureHander.ReleaseCursorIcon();
  ctrl.SetObjAttached(false);
 }
 else
 {
     ctrl.SetSlotMovedFlag(false);
 }
 ctrl.SetLastSlotUsed(indSlot);
}

function ReleaseSlot(index :int)
{
    ctrl.SetObjectInBag( index, null);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值