爆甲英雄传学习笔记

1.Editor编写

public override void OnInspectorGUI ()
         {
           // target是Editor里的一个属性,指的就是我们需要改变的那个类,这里做强转换,不解释。
                 Item_Profile item = target as Item_Profile;
           // 序列化更新,不解释。
                 serializedObject.Update();
 
           // Add your code here.
           // ……
 
           // 更新编辑后的数据。
           serializedObject.ApplyModifiedProperties();
 
      }

item.item_id = EditorGUILayout.IntField("auto_id", item.item_id); 

item.icon = EditorGUILayout.ObjectField ("icon", item.icon, typeof(Texture2D)) as Texture2D;

item.name = EditorGUILayout.IntField("name", item.name); 

EditorGUILayout.PropertyField(serializedObject.FindProperty(“type")); 枚举、Color、Class、数组、NGUI、AudioClip、KeyCode

2.设计Item

新建一个C#脚本,重命名为:Item_Profile

作为道具的一员,之间肯定有某些共同的元素,例如名字,买卖价格,稀有程度等等。所以,我们首先要设计的是这些共同的元素。
item_id        ID,这个ID有系统自动分配,所以不需要对齐作出设计,保留为public,只是为了方便查看而已。
icon             2D图标。
comment      道具的描述。
type             道具类型,武器或护甲之类的。
rare             稀有度。
color            颜色,关联稀有度,白色到紫色之类的可视化等级。[size=13.63636302948px] 
buy,sell        买卖价格。
limit_stack    堆栈上线,例如20个一组的面包,或且无法叠加的武器或护甲。
model           3D模型。


然后就是武器属性的设计
weapon_type   武器的类型,单手剑或双手剑。
damage           攻击力,物理攻击或各种元素攻击。
damage_r        攻击力的波动范围。


接着就是护盾和护驾的设计了,将他们放一起,是因为他们都属于防具,属性都一样。
clan                 种族,精灵或且兽人,如果装备有指定种族的话,这个属性能帮上忙。
armor_type      护甲类型,头部,手部还是护盾。
def                  防御力,各种元素防御力。


主要的道具我们都已经设计好了,下面让我们来搞点新意。小弟就拿大家都比较感兴趣的合成配方这个部分来举例吧。
parts                合成所需的道具及数量。这里可能大家会有个疑问,为什么不用item_id 而要使用 Item_Profile 来关联道具,这个问题在设计道具管理器的时候会有解释。
final_product     终于的合成品。

3.Item的管理器

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

public class Item_Database_Manager : MonoBehaviour
{

    public Item_Profile empty_item;

    public Item_Profile[] items;

    static Item_Database_Manager idm;

    // Use this for initialization
    void Awake()
    {
        DontDestroyOnLoad(gameObject);
        idm = gameObject.GetComponent<Item_Database_Manager>();

        // auto assign the id to item
        ReSort();
    }

    public void ReSort()
    {
        // auto assign the id to item
        for (int i = 0; i < items.Length; i++)
        {
            items[i].item_id = i;
        }
    }

    public static Item_Database_Manager Get_Manager()
    {
        if (idm == null)
        {
            Global_Manager.InitAll();
        }
        return idm;
    }

    // also referr to item id
    public Item_Profile Get_Item(int index)
    {
        index = Mathf.Clamp(index, 0, items.Length);
        return items[index];
    }

    public void Create_Empty_Item()
    {
        if (empty_item)
        {
            GameObject go = Instantiate(empty_item.gameObject) as GameObject;
            go.name = "item";
        }
    }

}

4.背包系统

道具槽,指定动作,新建C#脚本,重命名  Inventory_Slot,并实现 IComparable<Inventory_Slot>
接口,用于排序。

变量:

item_id        记录道具的ID

current_stack        当前的堆栈数



函数:

Inventory_Slot (int itemID)        构造函数,保证每个slot记录的都是都是有意义的道具,我们歧视无意义的Slot!!

public  bool Withdraw()        取出,或移除1个道具,如果事后堆栈数小于等于0,返回true,通知管理器删除这个Slot。

public   bool Deposit()        存入,或增加1个道具,如果事前堆栈数到达最大值,则无法存入,返回false,通知管理器。

public  bool Full_Stack() 判断当前堆栈数是否达到最大值。

public  int CompareTo (Inventory_Slot x) 用于排序用的,这个可以根据实际需要编写。

————————————————————————————————————————————

管理器,制定动作,新建C#脚本,重命名 Inventory_Manager。同样,设计成单例模式。

变量:

money        记录玩家的金钱,如有需要,可以添加更多的种类,或类WOW的各种货币。

player_inventory        玩家身上的背包。

store_inventory        仓库。

shop_inventory                商店,这样设计其实是不对的,这里主要为了测试方便而设计的。

[size=13.63636302948px] player_inventory_limitstore_inventory_limitshop_inventory_limit 背包的道具槽上限。

角色装备的ID,如果只要一个主角的话,可以将其设计成单例,所以一同写进管理器。
#region Equipment
        public int
                equipmentID_Main_Weapon = -1,
                equipmentID_Second_Weapon = -1,
                equipmentID_Shield = -1,
                equipmentID_Head = -1,
                equipmentID_Shoulder = -1,
                equipmentID_Belt = -1;
         // add more equipment here ...
#endregion        

背包种类的枚举,这个地方就是我所说的取巧的地方了,详细可以翻看代码。
enum Inventory_Type
        {
                Player,
                Store,
                Shop
        } ;

函数:

public static  Inventory_Manager Get_Manager() 这个方法同道具管理器的一样,获取管理器的实例。

public  bool Deposit(int  itemID, Inventory_Type type) 存入道具,道具ID,目标背包(玩家,仓库,商店),若目标背包堆栈达到上线,存入失败,返回false。

public  bool Withdraw(int  itemID, Inventory_Type type) 取出道具,道具ID,和源背包(从哪个背包里取出),查无此道具则取出失败,返回false。

public  bool Withdraw_at_slot(int  slotID, Inventory_Type type) 从指定道具槽取出道具,槽ID,源背包,槽不存在则返回false。

public  int Get_Current_Stack(int  slotID, Inventory_Type type) 获取当前道具槽的堆栈数,槽ID,源背包。

public  void  Sort(Inventory_Type type) 目标背包的道具重新排序。
——————————————————————————————————————————————————————————————————————————

新建C#脚本,重命名为 Unit_Inventory_Manager
变量:

int  itemID 要测试的道具ID

public  Inventory_Manager.Inventory_Type inventory_type
要测试的目标背包(玩家,仓库,商店)

Item_Profile itemInfo 道具信息,这个不需要赋值,这个根据所测试的道具ID,系统会自动复制,只要用于快速定位目标道具而已,方便在Project视图中定位而已,可无视之。

函数:

public void  Deposit() 向目标背包存在测试道具。

public void  Withdraw() 从目标背包取出测试道具。

public void  Show_Info() 显示/更新要测试的道具的Item_Profile文件。
——————————————————————————————————————————————————————————————————————

Inventory_Manager 里添加新的函数

public int  Get_Amount_Item(int itemID, Inventory_Type type), 返回道具的数量,用于判断是否有足够的材料制作新道具,若道具不熏在,返回-1。道具ID,背包类型。

public bool  Has_Item(int itemID, Inventory_Type type),是否拥有指定道具,简单不解释。道具ID,背包类型。

public bool  Can_Create_Item(int recipeID, Inventory_Type type),判断是否能制作新的道具,主要判定是否有足够材料。配方的道具ID,背包类型。

public Item_Profile  Create_Item(int recipeID, Inventory_Type type),制作道具,返回道具的描述文件(脚本或类型),并移除材料,配方保留。配方的道具ID,背包类型。(注意,正常的合成系统应该只能在玩家的背包或仓库才能进行的,所以外部调用的时候,需要判断好背包类型的合法性。UI篇里会继续探讨。)

Unit_Inventory_Manager 和  Unit_Inventory_Manager_Editor 只是添加了一个提供测试函数而已,没什么也别。但是值得注意的是, Unit_Inventory_Manager 中的参数  itemInfo 返回一个新制作出来的道具,用于快速定位而已,可无视。
5.UI_Inventory_Manager

Type,背包的类型

Decription_manager,描述UI管理器,自动根据所选择的道具类型而选择响应的描述UI。
Pages,用于显示当前页的一个UILabel。

Hold_to_move_hole_stack,这里打错字了,就让他一直错吧,这个堆栈操作的修饰键,按住则能对整个堆栈操作,例如买卖或移动一个堆。

Audio_onDrag, 拖动时候的声音,花俏的东西。【可忽略】

Slots,这个UI面板所管理的道具槽们的对象,例如一个面板能显示20个道具槽,没错,然后他就有20个slots的对象了。

6.就是茶水编写的脚本 UI_Item_Slot

Show_description_onclick,点击显示道具的描述,即打开描述面板并更新。
Show_description_onhover,悬停显示道具的描述。
Is_drag_slot,是否可以拖放。

7.设计最简单的 UI Description Weapon

Icon, 就一个纹理而已,用于显示道具的图标而已无压力。

Name,一个label和一个属性绑定的组件,用于显示道具名字和匹配道具的等级颜色,请小心如图配置好各项。

Text Area - Status,又一个label,用于显示道具属性。

Text Area - Description,又一个label,用于显示道具的描述。

8.UI Description Recipe

Icom,name,就是用于显示道具图表的纹理和名字的lable。(和以前的设计一样。)

Text Area,就是用于显示多行文本的大lable,分别用于显示道具的属性和备注。(和以前的一样。)

Item slot X, 直接使用我们的预设就好了。

Lable 就是用于显示一些分类文本的东西,(就是Parts,和 Final,没有什么特别之处。)


Create,是一个按钮,标准和典型的GUI按钮。如下图配置,这个一会会用到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值