上面两篇我们谈了交易和任务,这一篇我们来讨论下穿戴也就是装备系统。装备栏一般形式,因为仙剑装备栏系统一直都很模糊,仙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;
}
}
好了,这一篇我们就到这。
换装的代码在这里