我们的游戏世界(背包【仓库】,交易,任务,简单经济系统,装备)实现(基于仙剑demo聊聊游戏世界)第三篇谈谈装备

37 篇文章 1 订阅

上面两篇我们谈了交易和任务,这一篇我们来讨论下穿戴也就是装备系统。装备栏一般形式,因为仙剑装备栏系统一直都很模糊,仙5之前我们都看不到真正的纸娃娃试衣间,所以我们以网络游戏的装备栏举例子,我们一般看到的人物装备栏就是这样的,当然物品栏会根据游戏需要增减,比如说仙剑一般6个就够了,我们看下我们大概的东西需要,不要吐槽,我就是画个大概,比用图画本效果强多了,中间的舞台我们你做一个纸娃娃系统,放一个人物立绘上去,具体做法前面换装已经贴出源码并且讲原理了,其他部分头盔,衣服,武器护符等等,上面这些图形标志不代表真实效果,只是告诉我们在这些地方大该放这些就行了,做的时候去找美术商量具体效果,我们这里只讨论这些装备栏是怎么实现的。因为有了这些装备兰按钮,就可以调用我们之前写的纸娃娃系统了我们看下游戏中的大概效果。身上的东东画的不在我们想的位置,没关系,我们看下怎么画的,修改下,看看我们修改之后的面板什么样,我们把初始资金改成10000,另外修改下人物的等级,使玩家化身可以装备购买的东西,然后我们直接去武器店购买装备


我们每一个买一件装备右键装备上,好了我们整个的装备穿戴效果就这样了,怎么实现的呢?我们看代码(中间缺个人物的立绘,暂时我们先不加它,因为现在用的模型根本不支持换装,等有了合适模型我们在加,我这里说下原理,其实就是跟我们的小地图一样,我们在人物面前放一个摄像机,这个摄像机只照射人物一个物体,当我们在物品栏里编号变化的时候,人物的穿戴发生改变,纸娃娃的实现请看前面的代码)。

	[System.Serializable]
	public class Equipment{
		public string nameEquipmentWindow;
		public int windowEquipmentID;
		public Rect windowEquipmentRect;
		public Rect windowDescriptionRect;
		public SlotEquiptRect[] slotEquipmentRect;
		public bool openEquipment;// switch Equipment
	}

[System.Serializable]
	public class SlotEquipment{
		public int item_id;	
		public Item_Data.Equipment_Type equipmentType;
	}
	
	[System.Serializable]
	public class SlotEquiptRect{
		public Item_Data.Equipment_Type equipType;
		public Rect rect;
	}

public Equipment[] equipment;

[HideInInspector]
	public List<SlotEquipment> slotEquipment_item = new List<SlotEquipment>();

需要的定义在这里,start方法中的初始化

for(int i = 0; i < equipment[0].slotEquipmentRect.Length; i++){
			slotEquipment_item.Add(new SlotEquipment());
		}

OnGUI中的画法

public void OnGUI(){
		
		EquipmentWindow();
		
	}

我们看下,具体实现

	/// <summary>
	/// Equipments the window.
	/// </summary>
	private void EquipmentWindow(){
		ShowEquipment();
	}
	

	/// <summary>
	/// Shows the Equipment.
	/// </summary>
	private void ShowEquipment(){
		if(equipment[0].openEquipment){
			if(useStyle){
				GUI.SetNextControlName("Equipment");
				equipment[0].windowEquipmentRect = GUI.Window(equipment[0].windowEquipmentID, equipment[0].windowEquipmentRect, FunctionWindowEquipment, equipment[0].nameEquipmentWindow, guiStyleGroup[0].windowEquipmentStyle);
			}else{
				GUI.SetNextControlName("Equipment");
				equipment[0].windowEquipmentRect = GUI.Window(equipment[0].windowEquipmentID, equipment[0].windowEquipmentRect, FunctionWindowEquipment, equipment[0].nameEquipmentWindow);
			}
		}
	}

如果看了上面的篇章的话,对这个应该不陌生了,真正在这里起作用的方法是FunctionWindowEquipment,我们继续

//Function Window
	private void FunctionWindowEquipment(int windowID){
		GUI.DragWindow(new Rect(0,0,10000,60));
		for(int i = 0; i < equipment[0].slotEquipmentRect.Length; i++){
			if(Item_Data.instance != null){
				if(useStyle){
					GUI.Box(new Rect(equipment[0].slotEquipmentRect[i].rect.x, equipment[0].slotEquipmentRect[i].rect.y, equipment[0].slotEquipmentRect[i].rect.width, equipment[0].slotEquipmentRect[i].rect.height), new GUIContent("","slotEquipment"+(i).ToString()), guiStyleGroup[0].gridStyle);
					if(Item_Data.instance.Get_Item(slotEquipment_item[i].item_id) != null){
						GUI.DrawTexture(new Rect(equipment[0].slotEquipmentRect[i].rect.x, equipment[0].slotEquipmentRect[i].rect.y, equipment[0].slotEquipmentRect[i].rect.width, equipment[0].slotEquipmentRect[i].rect.height), Item_Data.instance.Get_Item(slotEquipment_item[i].item_id).item_Img);
					}else{
						GUI.DrawTexture(new Rect(equipment[0].slotEquipmentRect[i].rect.x, equipment[0].slotEquipmentRect[i].rect.y, equipment[0].slotEquipmentRect[i].rect.width, equipment[0].slotEquipmentRect[i].rect.height), null_Item_Texture);
					}
				}else{
					GUI.Box(new Rect(equipment[0].slotEquipmentRect[i].rect.x, equipment[0].slotEquipmentRect[i].rect.y, equipment[0].slotEquipmentRect[i].rect.width, equipment[0].slotEquipmentRect[i].rect.height), new GUIContent("","slotEquipment"+(i).ToString()));
					if(Item_Data.instance.Get_Item(slotEquipment_item[i].item_id) != null){
						GUI.DrawTexture(new Rect(equipment[0].slotEquipmentRect[i].rect.x, equipment[0].slotEquipmentRect[i].rect.y, equipment[0].slotEquipmentRect[i].rect.width, equipment[0].slotEquipmentRect[i].rect.height), Item_Data.instance.Get_Item(slotEquipment_item[i].item_id).item_Img);
					}else{
						GUI.DrawTexture(new Rect(equipment[0].slotEquipmentRect[i].rect.x, equipment[0].slotEquipmentRect[i].rect.y, equipment[0].slotEquipmentRect[i].rect.width, equipment[0].slotEquipmentRect[i].rect.height), null_Item_Texture);
					}
					
				}
				hover = GUI.tooltip;
			}
		}
		if(pickupStay){
			Vector3 mousePos = Input.mousePosition;
			if(itemImg_Pickup != null){
				GUI.DrawTexture(new Rect(mousePos.x-20-equipment[0].windowEquipmentRect .x, (Screen.height - mousePos.y)-20-equipment[0].windowEquipmentRect.y, 40,40),itemImg_Pickup);	
			}
		}
		
		ShowDescriptionBag(equipment[0].windowEquipmentRect, id_Hover);
	}
	

看了上面的代码,关于如何制作人物面板应该有很清晰的思路了吧,如果还有些模糊,可以在gui_menu中设置断点或者debug.log()打印当时数据的状态慢慢调试。

关于穿戴物品的属性,我们这里先不考虑,自己看下代码就好了,

/// <summary>
/// Item_data.
/// This script use to create an item
/// </summary>

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Item_Data : MonoBehaviour {
	
	public enum Equipment_Type{
		Null = 0, Head_Gear = 1, Armor = 2, Shoes = 3, Accessory = 4, Left_Hand = 5, Right_Hand = 6, Two_Hand = 7 	
	}
	
	
	[System.Serializable]
	public class Item{
		public string item_Name = "Item Name";
		public string item_Type = "Item Type";
		[Multiline]
		public string description = "Description Here";
		public int item_ID;
		public Texture2D item_Img;
		public GameObject item_Effect;
		public AudioClip item_Sfx;
		
		public bool gold;
		public Equipment_Type equipment_Type;
		public ClassType require_Class;
		public bool potion;
		
		public int price;
		public int hp, mp, atk, def, spd, hit;
		public float criPercent, atkSpd, atkRange, moveSpd;
	}
	
	public List<Item> item_equipment_set = new List<Item>();
	public List<Item> item_usable_set = new List<Item>();
	public List<Item> item_etc_set = new List<Item>();
	public Item[] item_gold = new Item[1];
	
	public static Item_Data instance;
	
	//Editor Variable
	[HideInInspector]
	public int sizeEquip= 0;
	[HideInInspector]
	public List<bool> showEquipSize = new List<bool>();
	[HideInInspector]
	public int sizeUsable= 0;
	[HideInInspector]
	public List<bool> showUsableSize = new List<bool>();
	[HideInInspector]
	public int sizeEtc= 0;
	[HideInInspector]
	public List<bool> showEtcSize = new List<bool>();
	
	
	
	public void Start(){
		instance = this;	
	}
	
	public Item Get_Item(int item_id){
		int i = 0;
		bool isEnd = false;
		if(isEnd == false){
			while(i < item_equipment_set.Count){
				if(item_id == item_equipment_set[i].item_ID){
					return item_equipment_set[i];
					i = item_equipment_set.Count;
					isEnd = true;
				}
				i++;
			}
		}
		i = 0;
		if(isEnd == false){
			while(i < item_usable_set.Count){
				if(item_id == item_usable_set[i].item_ID){
					return item_usable_set[i];
					i = item_usable_set.Count;
					isEnd = true;
				}
				i++;
			}
		}
		i = 0;
		if(isEnd == false){
			while(i < item_etc_set.Count){
				if(item_id == item_etc_set[i].item_ID){
					return item_etc_set[i];
					i = item_etc_set.Count;
					isEnd = true;
				}
				i++;
			}
		}
		i = 0;
		if(isEnd == false){
			while(i < item_gold.Length){
				if(item_id == item_gold[i].item_ID){
					return item_gold[i];
					i = item_gold.Length;
					isEnd = true;
				}
				i++;
			}
		}
		
		
		return null;
	}
	
}
好了,这一篇我们就到这。 换装的代码在这里


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值