精华内容
下载资源
问答
  • Unity3D的简单商店、背包与装备系统(UGUI)
    万次阅读
    2018-07-23 20:29:02

    Store And Equipment System In Unity3D

    Introduction

    物品元素可以说是所有RPG的必备系统,毕竟,如果没有物品系统就没有消耗,没有消耗哪能骗玩家充钱呢?最简单的物品系统应该是所谓的商店、背包加装备的结构,而这个Demo则主要基于UGUI实现一个简单的上述系统

    UI

    制作系统的第一步便是UI的绘制了。无论美术资源来自何方,画风如何,应该基本包括如下几个层面:

    • 角色信息界面,用于显示主角的装备槽位以及正在穿戴中的装备
    • 背包界面,用于显示主角拥有的物品集合
    • 金钱标签,用于显示主角当前拥有的钱币
    • 商店界面,用于显示当前售卖的物品集合
    • (可选)快速物品栏,通常与技能栏合用,让玩家能够快速使用物品

    在我的Demo中也基本实现了上述模块

    Bag System

    一个背包系统的组成很简单,即面板+很多的格子,再贴一个金钱的文本框和几个图标就能够完成,我的背包也是基于上述想法来实现的:

    • 通过Unity3D的Scroll View作为背包系统的主面板
    • 创建Grid对象,并设置其Image为相应的Spirit作为物品图标
    • 实现物品拖动逻辑,主要是在C#脚本实现动画表现,Lua更新数据,即注册onDrag事件,当鼠标拖动一个Grid时,创建一个当前Grid的副本,并在onDraging中不断获取当前鼠标所在的屏幕坐标赋值给副本的Transform,最后进行鼠标弹起位置的判断是否放在有效的区域,若位置合法则移动物品,并将数据写入Lua类,同步到服务器
    // copy current grid
    public static InventoryUIItemWrapperBase CreateDragObject(InventoryUIItemWrapperBase from)
    {
        var copy = GameObject.Instantiate<InventoryUIItemWrapperBase>(from);
        copy.index = from.index;
        copy.itemCollection = from.itemCollection;
        copy.item = from.item;
    
        var copyComp = copy.GetComponent<RectTransform>();
        copyComp.SetParent(InventorySettingsManager.instance.guiRoot.transform);
        copyComp.transform.localPosition = new Vector3(copyComp.transform.localPosition.x, copyComp.transform.localPosition.y, 0.0f);
        copyComp.sizeDelta = from.GetComponent<RectTransform>().sizeDelta;
    
        group.blocksRaycasts = false;
        group.interactable = false;
    
        return copy;
    }
    
    //draging event
    public static void OnDrag(PointerEventData eventData)
    {
        if (currentDragHandler != null)
        {
            currentDragHandler.OnDrag(eventData);
    
            if (OnDragging != null) OnDragging(currentDragHandler.dragLookup, currentDragHandler.currentlyDragging, eventData);
        }
    }
    
    
    //finish drag
    public static InventoryUIDragLookup OnEndDrag(PointerEventData eventData)
    {
        if (currentDragHandler == null) 
        {
            return null;
        }
        var lookup = currentDragHandler.OnEndDrag(InventoryUIUtility.currentlyHoveringWrapper, eventData);
        if (OnEndDragging != null)
        {
            OnEndDragging(lookup, currentDragHandler.currentlyDragging, eventData);
            AppFacade.instance.CallLua("pg.global.bag.moveItem", curItemId, eventData.getTargetGrid()); 
        }
    
        return lookup;
    }
    • 在初步实现中发现缺少了一个考虑的点,即拖拽到相同的物品应该合并,因此应当加入判断
    • 此外,能合并物品理应能拆分,于是加入左Shift键的监听事件,物品的拆分逻辑可重用拖动逻辑,即直接调用DragItem(curItemId, targetGrid)将物品移入下一格,并创建一个相应的克隆对象,改变其下标的数量。当然,当背包满时直接Return即可
    • 在Lua中应当调用服务器方法将数据写入数据库以保证数据的持久化
    function onEndMoveItem(curItemId, grid)
        self.server.MoveItem(curItemId, grid)
    end
    • 最后实现右键使用物品的逻辑,分消耗品和装备来进行不同的逻辑处理

    Advandace Bag System

    在上述的第一版实现完成后,其实还存在着一些不足:

    • 背包的格子很多,一次性加载会造成卡顿
    • 没必要每次移动物品后都写入数据库,可以在服务器内存里保留一个Map映射,当玩家下线后再根据此映射将整个背包的数据写入
      对于第一个问题,我采用类型WOW里的背包模式,即增加一个仅能装备背包的装备栏,并加入“背包”这个物品,根据玩家选择的背包动态加载格子而非一次性全部加载。第二个问题则在Bag.xml里新增一个属性ItemBagMap保存物品id与格子id的映射

    Store and PlayerInfo

    商店界面和个人信息界面和背包类似,只不过在每个Grid里加上了价格标签而已,并且点击物品可以弹出购买界面,这只是UI与逻辑的不同罢了,在这里就不详谈了。出于美观,还可以在个人信息界面的中间做一个人物立绘,通过设定相机渲染到一个Reneder Texture便可以实现了

    Pick Up Item

    有了物品系统,相应的拾取逻辑也是必不可少的。在我的实现中主要基于碰撞检测的回调函数:

    • 人物和掉落在地上的物品具有碰撞检测
    • 当产生碰撞时判断背包是否已满,未满创建物品对应的grid对象并销毁地上物品的GameObject
    • 物品存入背包成功则写入Lua
    public virtual void OnTriggerEnter(Collider col)
    {
        TryPickup(col.gameObject);
    }
    
    
    
    public virtual void OnTriggerEnter2D(Collider2D col)
    {
        TryPickup(col.gameObject);
    }
    
    protected virtual void TryPickup(GameObject obj)
    {
    
        if (obj.layer == InventorySettingsManager.instance.equipmentLayer)
        {
            return;
        }
    
        if (InventorySettingsManager.instance.itemTriggerOnPlayerCollision || CanPickupGold(obj))
        {
            var item = obj.GetComponent<ObjectTriggererItem>();
            if (item != null)
            {
                item.Use(this);
            }
        }
    }
    
    protected virtual bool CanPickupGold(GameObject obj)
    {
        return InventorySettingsManager.instance.alwaysTriggerGoldItemPickupOnPlayerCollision && obj.GetComponent<CurrencyInventoryItem>() != null;
    }
    
    protected virtual void PickUpSucc(itemId, gridId)
    {
        AppFacade.instance.CallLua("pg.global.bag.addItem", curItemId, gridId)
    }
    
    更多相关内容
  • Unity---商店搭建

    千次阅读 2021-11-23 15:43:53
    【千锋合集】史上最全Unity3D全套教程|匠心之作_哔哩哔哩_bilibili UI搭建

    【千锋合集】史上最全Unity3D全套教程|匠心之作_哔哩哔哩_bilibili

    UI搭建

     

    数据库配置

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using Mono.Data.Sqlite;

    public class SQLFrame{
        #region SingleTon
        private static SQLFrame instance;
        public static SQLFrame GetInstance() {
            if (instance == null) { 
            instance = new SQLFrame();
            }
            return instance;
        }
        private SQLFrame() {} //防止外界去new一个SQLFrame
        #endregion
        //连接字符串
        private string conStr;
        private SqliteConnection con;
        private SqliteCommand command;
        private SqliteDataReader reader;
        /// <summary>
        /// 打开数据库
        /// </summary>
        /// <param name="databaseName"></param>
        public void OpenDatabase(string databaseName) {
            //如果名称中不包含后缀,自动添加
            if (!databaseName.EndsWith(".sqlite")) {
                databaseName += ".sqlite";
            }
    #if UNITY_EDITOR
            conStr = "Data Source =" + Application.streamingAssetsPath +"/" +databaseName;
    #endif
            con = new SqliteConnection(conStr);
            //打开连接
            con.Open();
            //创建指令对象
            command = con.CreateCommand();
        }
        /// <summary>
        /// 关闭数据库
        /// </summary>
        public void CloseDatabase() {
            if (reader != null)
            {
                reader.Close();
                reader = null;
            }
            if (command != null)
            {
                command.Dispose();
                command = null;
            }
            if (con != null)
            {
                con.Close();
                con = null;
            }
        }
        /// <summary>
        /// 执行非查询类SQL语句
        /// </summary>
        /// <param name="query"></param>
        public int DontSelect(string query) {
            //赋值SQL语句
            command.CommandText = query;
            //执行SQL语句
            return command.ExecuteNonQuery();
        }
        public int Insert(string query) {
            return DontSelect(query);
        }
        public int Update(string query)
        {
            return DontSelect(query);
        }
        public int Delete(string query)
        {
            return DontSelect(query);
        }
        /// <summary>
        /// 查询单个数据
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public object SelectSingleData(string query) {
            //赋值SQL语句
            command.CommandText = query;
            //执行SQL语句,返回结果
            return command.ExecuteScalar();
        }
        /// <summary>
        /// 查询多个数据
        /// </summary>
        /// <param name="query"></param>
        public List<ArrayList> SelectMultipleData(string query) {
            //赋值SQL语句
            command.CommandText = query;
            //执行
            reader = command.ExecuteReader();
            //一行多列:ArrayList
            //多行多列:List<Arraylist>
            //实例化结果对象
            List<ArrayList> result = new List<ArrayList>();
            while (reader.Read()) {
                //声明一个ArrayList存储改行的所有数据
                ArrayList currentRow = new ArrayList();
                //遍历改行所有的列
                for (int i = 0; i < reader.FieldCount; i++) {
                    //将当前列的数据添加到集合
                    currentRow.Add(reader.GetValue(i));
                }
                //将当前行的数据放到List里面
                result.Add(currentRow);
            }
            //关闭读取器
            reader.Close();
            //返回结果
            return result;
        }
    }

    数据库代码

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

    public class EquipShopFrame : SQLFrame {
        #region SingleTon
        private static EquipShopFrame instance;
        public static new EquipShopFrame GetInstance() //盖掉父类方法
        {
            if (instance == null)
            {
                instance = new EquipShopFrame();
            }
            return instance;
        }
        private EquipShopFrame() { } //防止外界去new一个SQLFrame
        #endregion
        //SQl语句
        //private string sqlQuery;
        private string query;


        /// <summary>
        /// 买装备流程
        /// </summary>
        /// <param name="equipName"></param>
        public void BuyEquip(string equipName) {
            #region 买装备流程
            //1、查看要买的装备价值多少钱
            //2、查看当前召唤师有多少钱
            //3、判断钱够不够买装备
            //4、如果不够,拒绝购买
            //5、如果够,购买装备
            //5.1、获取装备属性加成
            //5.2、获取英雄当前属性值
            //5.3、属性加成与当前英雄的属性相加
            //5.4、更新到英雄表格中
            //5.5、获取英雄的装备存储字符串
            //5.6、拼接字符串,形成新的英雄装备存储记录
            //5.7、将新的英雄装备信息存储到数据库
            //5.8、将装备的花费扣除,更新英雄的金钱
            #endregion
        }
        public void SellEquip(string equipName) {

        }
        /// <summary>
        /// 设置英雄属性信息
        /// </summary>
        /// <param name="heroName"></param>
        /// <param name="heroEquips"></param>
        public void SetHeroEquips(string heroName, string heroEquips) {
            //编写SQL语句
            query = "Update HeroTable Set HeroEquips='" + heroEquips + "'Where HeroName='"+heroName+"'";
            //执行更新操作
            Update(query);
        }
        /// <summary>
        /// 获取英雄装备信息
        /// </summary>
        /// <param name="heroName"></param>
        public string GetHeroEquips(string heroName) {
            //编写SQL语句
            query = "Select HeroEquips From HeroTable Where HeroName='"+heroName+"'";
            //执行
            object result=SelectSingleData(query);
            if (result==null) {
                return null;
            }
            //返回结果
            return result.ToString();
        }

        /// <summary>
        /// 设置英雄的属性信息
        /// </summary>
        /// <param name="properties"></param>
        private void SetHeroProperties(string heroName,int[] properties) {
            //编写SQL语句
            query = "Update HeroTable Set HeroAD="+properties[0]
                +",HeroAP="+properties[1]+",HeroAR="+properties[2]+",HeroSR="+properties[3]+" Where HeroName'" + heroName + "'";
            //执行SQL语句
            Update(query);
        }
        /// <summary>
        /// 获取英雄此时的属性值
        /// </summary>
        /// <param name="heroName"></param>
        /// <returns></returns>
        public int[] GetHeroProperties(string heroName) {
            //编写SQL语句
            query= "Select * From HeroTable Where HeroName='" + heroName + "'";
            //执行SQL语句
            List<ArrayList> result=SelectMultipleData(query);
            //实例化属性数组
            int[] properties = new int[4];
            //循环获取值
            for (int i = 0; i < properties.Length; i++) {
                //转换数据并存储
                properties[i] = Convert.ToInt32(result[0][i + 2]); 
            }
            //返回结果
            return properties;
        }


        /// <summary>
        /// 获取当前装备的属性加成
        /// </summary>
        /// <param name="equipName"></param>
        /// <returns></returns>
        public int[] GetEquipProperties(string equipName) {
            //编写SQL语句
            query = "Select * From ShopTable Where EquipName='" + equipName + "'";
            //执行SQL语句
            List<ArrayList> result = SelectMultipleData(query);
            //实例化属性数组
            int[] properties = new int[4];
            //遍历赋值
            for (int i = 0; i < properties.Length; i++) {
                //转换数据并存储
                properties[i] = System.Convert.ToInt32(result[0][i + 2]);
            }
            //返回结果
            return properties;
        }


        /// <summary>
        /// 获取英雄剩余金钱
        /// </summary>
        /// <param name="heroName"></param>
        /// <returns></returns>
        public int GetHeroMoney(string heroName) {
            //编写SQL语句
            query = "Select HeroMoney From HeroTable Where HeroName='" + heroName + "'";
            //执行SQL语句
            object money = SelectSingleData(query);
            //返回整型结果
            return System.Convert.ToInt32(money);
        }
        /// <summary>
        /// 设置英雄金钱
        /// </summary>
        public void SetHeroMoney(string heroName,int heroMoney) {
            //编写SQL语句
            query = "Update HeroTable Set HeroMoney="+ heroMoney.ToString()+ "Where HeroName='" + heroName + "'";
            //执行SQL语句
            Update(query);
        }
        /// <summary>
        /// 获取某个装备值多少钱
        /// </summary>
        /// <param name="equipName"></param>
        /// <returns></returns>
        public int GetEquipMoney(string equipName) {
            //编写SQL语句
            query = "Select EquipMoney From ShopTable Where EquipName='"+equipName+"'";
            //执行SQL语句
            object money=SelectSingleData(query);
            //返回整型结果
            return System.Convert.ToInt32(money);
        }
    }

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

    public class EquipShopFrame : SQLFrame {
        #region SingleTon
        private static EquipShopFrame instance;
        public static new EquipShopFrame GetInstance() //盖掉父类方法
        {
            if (instance == null)
            {
                instance = new EquipShopFrame();
            }
            return instance;
        }
        private EquipShopFrame() { } //防止外界去new一个SQLFrame
        #endregion
        //SQl语句
        //private string sqlQuery;
        private string query;


        /// <summary>
        /// 买装备流程
        /// </summary>
        /// <param name="equipName"></param>
        public void BuyEquip(string equipName,string heroName) {
            #region 买装备流程
            //1、查看要买的装备价值多少钱
            int equipMoney = GetEquipMoney(equipName);
            //2、查看当前召唤师有多少钱
            int heroMoney = GetHeroMoney(heroName);
            //3、判断钱够不够买装备
            if (equipMoney > heroMoney) {
                //4、如果不够,拒绝购买
                Debug.Log("余额不足,无法购买!");
                return;
            }

            //5、如果够,购买装备
            //5.1、获取装备属性加成
            int[] equipProperties = GetEquipProperties(equipName);
            //5.2、获取英雄当前属性值
            int[] heroProperties = GetHeroProperties(heroName);
            //5.3、属性加成与当前英雄的属性相加
            int[] newHeroProperties=PropertiesOpration(heroProperties,equipProperties,1);
            //5.4、更新到英雄表格中
            SetHeroProperties(heroName,newHeroProperties);
            //5.5、获取英雄的装备存储字符串
            string equips=GetHeroEquips(heroName);
            //5.6、拼接字符串,形成新的英雄装备存储记录
            equips += equipName + "|";
            //5.7、将新的英雄装备信息存储到数据库
            SetHeroEquips(heroName, equips);
            //5.8、将装备的花费扣除,更新英雄的金钱
            SetHeroMoney(heroName,heroMoney - equipMoney);
            #endregion
        }
        public void SellEquip(string equipName, string heroName) {
            //1、查看要买的装备价值多少钱
            int equipMoney = GetEquipMoney(equipName);
            //2、查看当前召唤师有多少钱
            int heroMoney = GetHeroMoney(heroName);
            //3、扣钱
            heroMoney += equipMoney / 2;
            //4、英雄的money更新到数据库
            SetHeroMoney(heroName, heroMoney);
            //5、获取装备属性信息
            int[] equipProperties = GetEquipProperties(equipName);
            //6、获取英雄属性信息
            int[] heroProperties = GetHeroProperties(heroName);
            //7、英雄属性中移除该装备的属性加成
            int[] newHeroProperties=PropertiesOpration(heroProperties, equipProperties, 2);
            //8、更新英雄属性到数据库
            SetHeroProperties(heroName, newHeroProperties);
            //9、获取英雄装备字符串
            string equips = GetHeroEquips(heroName);
            //10、获取装备在字符串中的位置
            int equipIndex= equips.LastIndexOf(equipName);
            //11、移除装备字符串
            equips=equips.Remove(equipIndex, equipName.Length+1);
            //12、更新数据库
            SetHeroEquips(heroName, equips);

        }
        /// <summary>
        /// 设置英雄属性信息
        /// </summary>
        /// <param name="heroName"></param>
        /// <param name="heroEquips"></param>
        public void SetHeroEquips(string heroName, string heroEquips) {
            //编写SQL语句
            query = "Update HeroTable Set HeroEquips='" + heroEquips + "'Where HeroName='"+heroName+"'";
            //执行更新操作
            Update(query);
        }
        /// <summary>
        /// Propertieses the opration
        /// </summary>
        /// <param name="heroPpt"></param>
        /// <param name="equipPpt"></param>
        /// <param name="oprationID">1 for Add, 2 for Remove.</param>
        /// <returns></returns>
        public int[] PropertiesOpration(int[] heroPpt, int[] equipPpt,int oprationID) {
            //实例化结果数组
            int[] result = new int[heroPpt.Length];
            if (oprationID == 1) {
                for (int i = 0; i < result.Length; i++) {
                    //属性相加
                    result[i] = heroPpt[i] + equipPpt[i];
                }
            }
            else if(oprationID==2) {
                for (int i = 0; i < result.Length; i++)
                {
                    //移除装备属性加成
                    result[i] = heroPpt[i] - equipPpt[i];
                }
            }
            return result;
        }


        /// <summary>
        /// 获取英雄装备信息
        /// </summary>
        /// <param name="heroName"></param>
        public string GetHeroEquips(string heroName) {
            //编写SQL语句
            query = "Select HeroEquips From HeroTable Where HeroName='"+heroName+"'";
            //执行
            object result=SelectSingleData(query);
            if (result==null) {
                return null;
            }
            //返回结果
            return result.ToString();
        }

        /// <summary>
        /// 设置英雄的属性信息
        /// </summary>
        /// <param name="properties"></param>
        private void SetHeroProperties(string heroName,int[] properties) {
            //编写SQL语句
            query = "Update HeroTable Set HeroAD="+properties[0]
                +",HeroAP="+properties[1]+",HeroAR="+properties[2]+",HeroSR="+properties[3]+" Where HeroName='" + heroName + "'";
            //执行SQL语句
            Update(query);
        }
        /// <summary>
        /// 获取英雄此时的属性值
        /// </summary>
        /// <param name="heroName"></param>
        /// <returns></returns>
        public int[] GetHeroProperties(string heroName) {
            //编写SQL语句
            query= "Select * From HeroTable Where HeroName='" + heroName + "'";
            //执行SQL语句
            List<ArrayList> result=SelectMultipleData(query);
            //实例化属性数组
            int[] properties = new int[4];
            //循环获取值
            for (int i = 0; i < properties.Length; i++) {
                //转换数据并存储
                properties[i] = Convert.ToInt32(result[0][i + 2]); 
            }
            //返回结果
            return properties;
        }


        /// <summary>
        /// 获取当前装备的属性加成
        /// </summary>
        /// <param name="equipName"></param>
        /// <returns></returns>
        public int[] GetEquipProperties(string equipName) {
            //编写SQL语句
            query = "Select * From ShopTable Where EquipName='" + equipName + "'";
            //执行SQL语句
            List<ArrayList> result = SelectMultipleData(query);
            //实例化属性数组
            int[] properties = new int[4];
            //遍历赋值
            for (int i = 0; i < properties.Length; i++) {
                //转换数据并存储
                properties[i] = System.Convert.ToInt32(result[0][i + 2]);
            }
            //返回结果
            return properties;
        }


        /// <summary>
        /// 获取英雄剩余金钱
        /// </summary>
        /// <param name="heroName"></param>
        /// <returns></returns>
        public int GetHeroMoney(string heroName) {
            //编写SQL语句
            query = "Select HeroMoney From HeroTable Where HeroName='" + heroName + "'";
            //执行SQL语句
            object money = SelectSingleData(query);
            //返回整型结果
            return System.Convert.ToInt32(money);
        }
        /// <summary>
        /// 设置英雄金钱
        /// </summary>
        public void SetHeroMoney(string heroName,int heroMoney) {
            //编写SQL语句
            query = "Update HeroTable Set HeroMoney="+ heroMoney.ToString()+ " Where HeroName='" + heroName + "'";
            //执行SQL语句
            Update(query);
        }
        /// <summary>
        /// 获取某个装备值多少钱
        /// </summary>
        /// <param name="equipName"></param>
        /// <returns></returns>
        public int GetEquipMoney(string equipName) {
            //编写SQL语句
            query = "Select EquipMoney From ShopTable Where EquipName='"+equipName+"'";
            //执行SQL语句
            object money=SelectSingleData(query);
            //返回整型结果
            return System.Convert.ToInt32(money);
        }
    }

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

    public class ShopView : MonoBehaviour {
        #region UI Component
        //商店装备的预设体
        private GameObject shopEquipPrefab;
        //商店窗口
        private Transform shopWindow;

        #endregion

        //装备商店单例
        EquipShopFrame eFrame;
        private void Awake()
        {
            eFrame = EquipShopFrame.GetInstance();
           
            UIComponentInit();
        }
        private void Start()
        {
            //打开数据库
            eFrame.OpenDatabase("ShopDatabase");
            //初始化商店
            ShopInit();
        }
        /// <summary>
        /// UI组件初始化
        /// </summary>
        private void UIComponentInit() {
            shopWindow = transform.Find("ShopWindow");
            shopEquipPrefab = Resources.Load<GameObject>("Prefabs/ShopEquip");
        }


        /// <summary>
        /// 商品初始化
        /// </summary>
        private void ShopInit() {
            //获取商店所有装备的名称
             string[] equips=eFrame.GetShopEquips();
            //遍历生成所有商店装备
            for (int i=0;i<equips.Length;i++) {
                //生成装备对象
                GameObject crtEquip=Instantiate(shopEquipPrefab);
                //找到存放装备图片的格子
                Transform box=shopWindow.GetChild(i);
                //设置为格子的子对象
                crtEquip.transform.SetParent(box);
                //设置本地坐标
                crtEquip.transform.localPosition = Vector3.zero;
                //设置缩放
                crtEquip.transform.localScale = Vector3.one;
                //获取装备图片【Sprite】
                Sprite equipSpr=Resources.Load<Sprite>("Textures/"+equips[i]);
                //更改装备图片
                crtEquip.GetComponent<Image>().sprite = equipSpr;
            }

        }
        private void OnApplicationQuit()
        {
            //关闭数据库
            eFrame.CloseDatabase();
        }
    }

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

    public class ShopEquip : MonoBehaviour {
        //按钮组件
        private Button shopEquipBtn;

        /// <summary>
        /// 商店装备初始化
        /// </summary>
        public void ShopEquipInit() {
            //获取按钮组件
            shopEquipBtn = GetComponent<Button>();
            //绑定点击事件
            shopEquipBtn.onClick.AddListener(OnShopEquipButtonClick);
        }


        public void OnShopEquipButtonClick() {
            //购买该装备
            Debug.Log("ok");
        }

    }
     

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

    public class ShopView : MonoBehaviour {
        #region UI Component
        //商店装备的预设体
        private GameObject shopEquipPrefab;
        //商店窗口
        private Transform shopWindow;

        #endregion

        //装备商店单例
        EquipShopFrame eFrame;
        private void Awake()
        {
            eFrame = EquipShopFrame.GetInstance();
           
            UIComponentInit();
        }
        private void Start()
        {
            //打开数据库
            eFrame.OpenDatabase("ShopDatabase");
            //初始化商店
            ShopInit();
        }
        /// <summary>
        /// UI组件初始化
        /// </summary>
        private void UIComponentInit() {
            shopWindow = transform.Find("ShopWindow");
            shopEquipPrefab = Resources.Load<GameObject>("Prefabs/ShopEquip");
        }


        /// <summary>
        /// 商品初始化
        /// </summary>
        private void ShopInit() {
            //获取商店所有装备的名称
             string[] equips=eFrame.GetShopEquips();
            //遍历生成所有商店装备
            for (int i=0;i<equips.Length;i++) {
                //生成装备对象
                GameObject crtEquip=Instantiate(shopEquipPrefab);
                //找到存放装备图片的格子
                Transform box=shopWindow.GetChild(i);
                //设置为格子的子对象
                crtEquip.transform.SetParent(box);
                //设置本地坐标
                crtEquip.transform.localPosition = Vector3.zero;
                //设置缩放
                crtEquip.transform.localScale = Vector3.one;
                //获取装备图片【Sprite】
                Sprite equipSpr=Resources.Load<Sprite>("Textures/"+equips[i]);
                //更改装备图片
                crtEquip.GetComponent<Image>().sprite = equipSpr;
                //给装备按钮添加点击事件
                crtEquip.GetComponent<ShopEquip>().ShopEquipInit();
            }

        }
        private void OnApplicationQuit()
        {
            //关闭数据库
            eFrame.CloseDatabase();
        }
    }

     

     

    代码汇总:

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

    public class BagEquip : MonoBehaviour {
        private Button bagEquipBtn;
        private string heroName;
        private string equipName;
        private Action updateHeroMsg;

        /// <summary>
        /// 背包装备初始化
        /// </summary>
        public void BagEquipInit(string heroName, Action updateHeroMsg) {
            this.heroName = heroName;
            this.updateHeroMsg = updateHeroMsg;

            bagEquipBtn = GetComponent<Button>();
            bagEquipBtn.onClick.AddListener(OnBagEquipButtonClick);
            //获取装备名称
            equipName = GetComponent<Image>().sprite.name;
        }
        private void OnBagEquipButtonClick() {
            //TODO:卖掉该装备
            EquipShopFrame.GetInstance().SellEquip(equipName, heroName);
            //将数据库的最新数据更新到UI
            if (updateHeroMsg != null)
            {
                updateHeroMsg();
            }
        }
    }
     

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

    public class ShopEquip : MonoBehaviour {
        //按钮组件
        private Button shopEquipBtn;
        private string equipName;
        private string heroName;
        //更新英雄信息事件
        private Action updateHeroMsg;

        /// <summary>
        /// 商店装备初始化
        /// </summary>
        public void ShopEquipInit(string heroName, Action updateHeroMsg) {
            //设置英雄名称
            this.heroName = heroName;
            //设置更新事件
            this.updateHeroMsg = updateHeroMsg;
            //获取按钮组件
            shopEquipBtn = GetComponent<Button>();
            //绑定点击事件
            shopEquipBtn.onClick.AddListener(OnShopEquipButtonClick);
            //获取装备名称
            equipName = GetComponent<Image>().sprite.name;
        }


        public void OnShopEquipButtonClick() {
            //购买该装备
            //进行数据库操作
            EquipShopFrame.GetInstance().BuyEquip(equipName, heroName);
            //将数据库的最新数据更新到UI
            if (updateHeroMsg != null) { 
            updateHeroMsg(); }
        }

    }
     

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

    public class ShopView : MonoBehaviour {
        #region UI Component
        //商店装备的预设体
        private GameObject shopEquipPrefab;
        //背包装备的预设体
        private GameObject bagEquipPrefab;
        //商店窗口
        private Transform shopWindow;
        //背包窗口
        private Transform bagWindow;
        //玩家名称文本
        private Text heroNameText;
        //四个属性文本
        private Text[] propertiesText;
        //英雄金钱文本
        private Text heroMoneyText;
        
        #endregion

        //装备商店单例
        EquipShopFrame eFrame;
        //英雄名称
        private string heroName;
        private void Awake()
        {
            eFrame = EquipShopFrame.GetInstance();
           
            UIComponentInit();
        }
        private void Start()
        {
            //打开数据库
            eFrame.OpenDatabase("ShopDatabase");
            //设置英雄名称文本
            SetHeroNameText();
            //初始化商店
            ShopInit();
            //初始化英雄信息
            UpdateHeroMsg();
        }
        /// <summary>
        /// UI组件初始化
        /// </summary>
        private void UIComponentInit() {
            shopWindow = transform.Find("ShopWindow");
            bagWindow = transform.Find("BagWindow");
            heroNameText = transform.GetChild(3).GetComponent<Text>();
            //找到四个属性文本框的父对象
            Transform propertiesParent = transform.Find("HeroPropertiesText");
            //实例化属性文本数组
            propertiesText = new Text[4];
            //遍历获取属性的文本组件
            for (int i = 0; i < propertiesText.Length; i++) {
                propertiesText[i] = propertiesParent.GetChild(i).GetComponent<Text>();
            }
            //获取英雄金钱文本
            heroMoneyText = transform.Find("Moneyicon/Text").GetComponent<Text>();
            //从Resources中加载两个预设体
            shopEquipPrefab = Resources.Load<GameObject>("Prefabs/ShopEquip");
            bagEquipPrefab=Resources.Load<GameObject>("Prefabs/BagEquip");
        }


        /// <summary>
        /// 商品初始化
        /// </summary>
        private void ShopInit() {
            //获取商店所有装备的名称
             string[] equips=eFrame.GetShopEquips();
            //遍历生成所有商店装备
            for (int i=0;i<equips.Length;i++) {
                //生成装备对象
                GameObject crtEquip=Instantiate(shopEquipPrefab);
                //找到存放装备图片的格子
                Transform box=shopWindow.GetChild(i);
                //设置为格子的子对象
                crtEquip.transform.SetParent(box);
                //设置本地坐标
                crtEquip.transform.localPosition = Vector3.zero;
                //设置缩放
                crtEquip.transform.localScale = Vector3.one;
                //获取装备图片【Sprite】
                Sprite equipSpr=Resources.Load<Sprite>("Textures/"+equips[i]);
                //更改装备图片
                crtEquip.GetComponent<Image>().sprite = equipSpr;
                //给装备按钮添加点击事件
                crtEquip.GetComponent<ShopEquip>().ShopEquipInit(heroName,UpdateHeroMsg);
            }

        }
        /// <summary>
        /// 设置英雄名称文本
        /// </summary>
        private void SetHeroNameText() {
            //获取英雄名称
            heroName = eFrame.GetHeroName();
            //设置英雄名称
            heroNameText.text = heroName;
        }
        /// <summary>
        /// 设置英雄属性信息
        /// </summary>
        private void SetHeroProperties() {
            //获取英雄属性信息
            int[] properties = eFrame.GetHeroProperties(heroName);
            //设置到UI
            for (int i = 0; i < propertiesText.Length; i++) {
                propertiesText[i].text = properties[i].ToString();
            }
            
        }
        private void SetHeroMoney() {
            //获取英雄的金钱数字
            int money = eFrame.GetHeroMoney(heroName);
            //设置到UI
            heroMoneyText.text = money.ToString();
        }
        //清空英雄背包装备
        private void ClearHeroBagEquips() {
            for (int i = 0; i < bagWindow.childCount; i++) {
                Transform bagBox=bagWindow.GetChild(i);
                if (bagBox.childCount != 0&&bagBox.name!="Header") {
                    //将背包格子中的装备销毁掉
                    Destroy(bagBox.GetChild(0).gameObject);
                }
            }
        }

        //设置英雄背包装备
        private void SetHeroBagEquips() {
            //获取背包中所有装备名称
            string[] equips=eFrame.GetHeroEquipsArray(heroName);
            //遍历所有的装备名称
            for (int i = 0; i < equips.Length; i++) {
                if (equips[i] == "") 
                    //跳过他
                    continue;
                //生成背包装备
                GameObject bagEquip=Instantiate(bagEquipPrefab);
                //获取父对象
                Transform bagBox = bagWindow.GetChild(i);
                //设置父对象
                bagEquip.transform.SetParent(bagBox);
                //设置本地坐标
                bagEquip.transform.localPosition = Vector3.zero;
                //设置缩放
                bagEquip.transform.localScale = Vector3.one;
                //获取装备图片
                Sprite equipSpr=Resources.Load<Sprite>("Textures/"+equips[i]);
                //设置图片
                bagEquip.GetComponent<Image>().sprite=equipSpr;
                //初始化背包装备
                bagEquip.GetComponent<BagEquip>().BagEquipInit(heroName,UpdateHeroMsg);

                
            }
        }
        /// <summary>
        /// 更新玩家信息
        /// </summary>
        private void UpdateHeroMsg()
        {
            
            //设置英雄属性文本
            SetHeroProperties();
            //设置英雄金钱文本
            SetHeroMoney();
            //清理英雄的背包
            ClearHeroBagEquips();
            //设置英雄背包装备
            SetHeroBagEquips();
        }

        private void OnApplicationQuit()
        {
            //关闭数据库
            eFrame.CloseDatabase();
        }
    }
     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using Mono.Data.Sqlite;

    public class SQLFrame{
        #region SingleTon
        private static SQLFrame instance;
        public static SQLFrame GetInstance() {
            if (instance == null) { 
            instance = new SQLFrame();
            }
            return instance;
        }
        protected SQLFrame() {} //防止外界去new一个SQLFrame
        #endregion
        //连接字符串
        private string conStr;
        private SqliteConnection con;
        private SqliteCommand command;
        private SqliteDataReader reader;
        /// <summary>
        /// 打开数据库
        /// </summary>
        /// <param name="databaseName"></param>
        public void OpenDatabase(string databaseName) {
            //如果名称中不包含后缀,自动添加
            if (!databaseName.EndsWith(".sqlite")) {
                databaseName += ".sqlite";
            }
    #if UNITY_EDITOR
            conStr = "Data Source =" + Application.streamingAssetsPath +"/" + databaseName;
    #endif
            con = new SqliteConnection(conStr);
            //打开连接
            con.Open();
            //创建指令对象
            command = con.CreateCommand();
        }
        /// <summary>
        /// 关闭数据库
        /// </summary>
        public void CloseDatabase() {
            if (reader != null)
            {
                reader.Close();
                reader = null;
            }
            if (command != null)
            {
                command.Dispose();
                command = null;
            }
            if (con != null)
            {
                con.Close();
                con = null;
            }
        }
        /// <summary>
        /// 执行非查询类SQL语句
        /// </summary>
        /// <param name="query"></param>
        public int DontSelect(string query) {
            //赋值SQL语句
            command.CommandText = query;
            //执行SQL语句
            return command.ExecuteNonQuery();
        }
        public int Insert(string query) {
            return DontSelect(query);
        }
        public int Update(string query)
        {
            return DontSelect(query);
        }
        public int Delete(string query)
        {
            return DontSelect(query);
        }
        /// <summary>
        /// 查询单个数据
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public object SelectSingleData(string query) {
            //赋值SQL语句
            command.CommandText = query;
            //执行SQL语句,返回结果
            return command.ExecuteScalar();
        }
        /// <summary>
        /// 查询多个数据
        /// </summary>
        /// <param name="query"></param>
        public List<ArrayList> SelectMultipleData(string query) {
            //赋值SQL语句
            command.CommandText = query;
            //执行
            reader = command.ExecuteReader();
            //一行多列:ArrayList
            //多行多列:List<Arraylist>
            //实例化结果对象
            List<ArrayList> result = new List<ArrayList>();
            while (reader.Read()) {
                //声明一个ArrayList存储改行的所有数据
                ArrayList currentRow = new ArrayList();
                //遍历改行所有的列
                for (int i = 0; i < reader.FieldCount; i++) {
                    //将当前列的数据添加到集合
                    currentRow.Add(reader.GetValue(i));
                }
                //将当前行的数据放到List里面
                result.Add(currentRow);
            }
            //关闭读取器
            reader.Close();
            //返回结果
            return result;
        }
    }
     

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

    public class EquipShopFrame : SQLFrame {
        #region SingleTon
        private static EquipShopFrame instance;
        public static new EquipShopFrame GetInstance() //盖掉父类方法
        {
            if (instance == null)
            {
                instance = new EquipShopFrame();
            }
            return instance;
        }
        private EquipShopFrame() { } //防止外界去new一个SQLFrame
        #endregion
        //SQl语句
        //private string sqlQuery;
        private string query;


        /// <summary>
        /// 买装备流程
        /// </summary>
        /// <param name="equipName"></param>
        public void BuyEquip(string equipName,string heroName) {
            #region 买装备流程
            //1、查看要买的装备价值多少钱
            int equipMoney = GetEquipMoney(equipName);
            //2、查看当前召唤师有多少钱
            int heroMoney = GetHeroMoney(heroName);
            //3、判断钱够不够买装备
            if (equipMoney > heroMoney) {
                //4、如果不够,拒绝购买
                Debug.Log("余额不足,无法购买!");
                return;
            }

            //5、如果够,购买装备
            //5.1、获取装备属性加成
            int[] equipProperties = GetEquipProperties(equipName);
            //5.2、获取英雄当前属性值
            int[] heroProperties = GetHeroProperties(heroName);
            //5.3、属性加成与当前英雄的属性相加
            int[] newHeroProperties=PropertiesOpration(heroProperties,equipProperties,1);
            //5.4、更新到英雄表格中
            SetHeroProperties(heroName,newHeroProperties);
            //5.5、获取英雄的装备存储字符串
            string equips=GetHeroEquips(heroName);
            //5.6、拼接字符串,形成新的英雄装备存储记录
            equips += equipName + "|";
            //5.7、将新的英雄装备信息存储到数据库
            SetHeroEquips(heroName, equips);
            //5.8、将装备的花费扣除,更新英雄的金钱
            SetHeroMoney(heroName,heroMoney - equipMoney);
            #endregion
        }
        public void SellEquip(string equipName, string heroName) {
            //1、查看要买的装备价值多少钱
            int equipMoney = GetEquipMoney(equipName);
            //2、查看当前召唤师有多少钱
            int heroMoney = GetHeroMoney(heroName);
            //3、扣钱
            heroMoney += equipMoney / 2;
            //4、英雄的money更新到数据库
            SetHeroMoney(heroName, heroMoney);
            //5、获取装备属性信息
            int[] equipProperties = GetEquipProperties(equipName);
            //6、获取英雄属性信息
            int[] heroProperties = GetHeroProperties(heroName);
            //7、英雄属性中移除该装备的属性加成
            int[] newHeroProperties=PropertiesOpration(heroProperties, equipProperties, 2);
            //8、更新英雄属性到数据库
            SetHeroProperties(heroName, newHeroProperties);
            //9、获取英雄装备字符串
            string equips = GetHeroEquips(heroName);
            //10、获取装备在字符串中的位置
            int equipIndex= equips.LastIndexOf(equipName);
            //11、移除装备字符串
            equips=equips.Remove(equipIndex, equipName.Length+1);
            //12、更新数据库
            SetHeroEquips(heroName, equips);

        }
        /// <summary>
        /// 设置英雄属性信息
        /// </summary>
        /// <param name="heroName"></param>
        /// <param name="heroEquips"></param>
        public void SetHeroEquips(string heroName, string heroEquips) {
            //编写SQL语句
            query = "Update HeroTable Set HeroEquips='" + heroEquips + "'Where HeroName='"+heroName+"'";
            //执行更新操作
            Update(query);
        }
        /// <summary>
        /// Propertieses the opration
        /// </summary>
        /// <param name="heroPpt"></param>
        /// <param name="equipPpt"></param>
        /// <param name="oprationID">1 for Add, 2 for Remove.</param>
        /// <returns></returns>
        public int[] PropertiesOpration(int[] heroPpt, int[] equipPpt,int oprationID) {
            //实例化结果数组
            int[] result = new int[heroPpt.Length];
            if (oprationID == 1) {
                for (int i = 0; i < result.Length; i++) {
                    //属性相加
                    result[i] = heroPpt[i] + equipPpt[i];
                }
            }
            else if(oprationID==2) {
                for (int i = 0; i < result.Length; i++)
                {
                    //移除装备属性加成
                    result[i] = heroPpt[i] - equipPpt[i];
                }
            }
            return result;
        }


        /// <summary>
        /// 获取英雄装备数组
        /// </summary>
        /// <param name="heroName"></param>
        /// <returns></returns>
        public string[] GetHeroEquipsArray(string heroName) {
            //获取装备字符串
            string equips = GetHeroEquips(heroName);
            //拆分字符串
            return equips.Split(new char[] { '|' });
        }
        /// <summary>
        /// 获取英雄装备信息
        /// </summary>
        /// <param name="heroName"></param>
        public string GetHeroEquips(string heroName) {
            //编写SQL语句
            query = "Select HeroEquips From HeroTable Where HeroName='"+heroName+"'";
            //执行
            object result=SelectSingleData(query);
            if (result==null) {
                return null;
            }
            //返回结果
            return result.ToString();
        }

        /// <summary>
        /// 设置英雄的属性信息
        /// </summary>
        /// <param name="properties"></param>
        private void SetHeroProperties(string heroName,int[] properties) {
            //编写SQL语句
            query = "Update HeroTable Set HeroAD="+properties[0]
                +",HeroAP="+properties[1]+",HeroAR="+properties[2]+",HeroSR="+properties[3]+" Where HeroName='" + heroName + "'";
            //执行SQL语句
            Update(query);
        }
        /// <summary>
        /// 获取英雄此时的属性值
        /// </summary>
        /// <param name="heroName"></param>
        /// <returns></returns>
        public int[] GetHeroProperties(string heroName) {
            //编写SQL语句
            query= "Select * From HeroTable Where HeroName='" + heroName + "'";
            //执行SQL语句
            List<ArrayList> result=SelectMultipleData(query);
            //实例化属性数组
            int[] properties = new int[4];
            //循环获取值
            for (int i = 0; i < properties.Length; i++) {
                //转换数据并存储
                properties[i] = Convert.ToInt32(result[0][i + 2]); 
            }
            //返回结果
            return properties;
        }


        /// <summary>
        /// 获取当前装备的属性加成
        /// </summary>
        /// <param name="equipName"></param>
        /// <returns></returns>
        public int[] GetEquipProperties(string equipName) {
            //编写SQL语句
            query = "Select * From ShopTable Where EquipName='" + equipName + "'";
            //执行SQL语句
            List<ArrayList> result = SelectMultipleData(query);
            //实例化属性数组
            int[] properties = new int[4];
            //遍历赋值
            for (int i = 0; i < properties.Length; i++) {
                //转换数据并存储
                properties[i] = System.Convert.ToInt32(result[0][i + 2]);
            }
            //返回结果
            return properties;
        }


        /// <summary>
        /// 获取英雄剩余金钱
        /// </summary>
        /// <param name="heroName"></param>
        /// <returns></returns>
        public int GetHeroMoney(string heroName) {
            //编写SQL语句
            query = "Select HeroMoney From HeroTable Where HeroName='" + heroName + "'";
            //执行SQL语句
            object money = SelectSingleData(query);
            //返回整型结果
            return Convert.ToInt32(money);
        }
        /// <summary>
        /// 设置英雄金钱
        /// </summary>
        public void SetHeroMoney(string heroName,int heroMoney) {
            //编写SQL语句
            query = "Update HeroTable Set HeroMoney="+ heroMoney.ToString()+ " Where HeroName='" + heroName + "'";
            //执行SQL语句
            Update(query);
        }
        /// <summary>
        /// 获取某个装备值多少钱
        /// </summary>
        /// <param name="equipName"></param>
        /// <returns></returns>
        public int GetEquipMoney(string equipName) {
            //编写SQL语句
            query = "Select EquipMoney From ShopTable Where EquipName='"+equipName+"'";
            //执行SQL语句
            object money=SelectSingleData(query);
            //返回整型结果
            return System.Convert.ToInt32(money);
        }
        /// <summary>
        /// 获取商店中的所有装备
        /// </summary>
        /// <returns></returns>
        public string[] GetShopEquips() {
            //编写SQL语句
            query = "Select EquipName From ShopTable";
            //执行语句
            List<ArrayList> result=SelectMultipleData(query);
            //实例化装备数组
            string[] equips = new string[result.Count];
            //遍历存储装备名称
            for (int i=0;i<equips.Length;i++) {
                equips[i] = result[i][0].ToString();
            }
            //返回
            return equips;
        }
        public string GetHeroName() {
            //编写sql语句
            query = "Select HeroName From HeroTable";
            //执行sql语句
            return SelectSingleData(query).ToString();
        }
    }
     

    展开全文
  • 最近项目遇到这样的需求,要求从App内部点击按钮或链接,跳转到应用商店的某个APP的详情页面,怎么实现此功能呢?下面小编给大家分享Android如何跳转到应用商店的APP详情页面,需要的朋友参考下
  • 发布时间:2017-12-14在服务器多人游戏中,我们经常会用到半砖商店,那么半砖商店的指令是什么呢?不知道指令就像有一个功能很强大的机器在你面前,你却不知道他的开关在哪里一样,是一件非常无奈的事情,今天游戏园小编为...

    发布时间:2017-12-14

    在服务器多人游戏中,我们经常会用到半砖商店,那么半砖商店的指令是什么呢?不知道指令就像有一个功能很强大的机器在你面前,你却不知道他的开关在哪里一样,是一件非常无奈的事情,今天游戏园小编为大家带来了我的世界半砖商店指令大全 ...

    标签:

    我的世界 问答帮助

    2bf5cb6bc5b2c14e4562fea32352ef7f.png

    发布时间:2017-08-12

    我的世界1.9红石自动商店详解 使用绿宝石换取自己想要的物品.那下面给大家分享的是我的世界中的商店哦~有了这个商店就可以换取自己想要的物品哦~只要你有绿宝石. 游戏园我的世界官方群:325049520(已满) 二群:25 ...

    标签:

    我的世界 游戏攻略

    0b79720f63fa3b546ee0430e5c391857.png

    发布时间:2017-06-02

    我的世界BossShop商店超详细教程分享.那今天给大家带来的是我的世界中Bossshop商店的教程,那感兴趣的玩家不妨进来看看下面关于Bossshop商店的制作教程吧!希望大家喜欢. Bossshop插件教程 下载地址 ...

    标签:

    我的世界 游戏攻略

    4307d871653cdd62b0849db9b9abea49.png

    发布时间:2016-05-29

    我的世界创世神指令很多新手玩家还不知道,有哪些创世神指令?创世神指令怎么用?下面99单机网小编就来分享我的世界创世神指令大全,供玩家参考. 我的世界创世神指令能够只需输入指令就能方便简单的达到目的了,很多无法完成的操作, ...

    标签:

    游戏资讯 攻略秘籍

    19320e418c3067aac33ea433e4b15c3f.png

    发布时间:2016-06-03

    我的世界快速回家指令分享给玩家,玩家在体验生存的的过程中很容易迷路,找不到回家的路,那该怎么办呢?看看我的世界快速回家指令. 设置家的指令: 注册账号 /register 密码 登陆账号 /login 密码 给玩家金钱 ...

    标签:

    我的世界攻略 我的世界 我的世界快速回家指令

    发布时间:2016-06-29

    服务器指令大全(上) 我的世界是一款3D的第一人称沙盘游戏,所呈现的世界并不是华丽的画面与特效,而是注重在游戏性上面. 玩家在游戏中做着「建设」与「破坏」两件事,但是透过像乐高一样的积木来组合与拼 ...

    标签:

    我的世界攻略 我的世界 我的世界服务器指令

    15ec56b5b4c72d1ac3225128ce928e1c.png

    发布时间:2016-05-13

    自动售货机做法(1) 我的世界自动售货机怎么做 自动售货机制作方法汇总.我的世界里面红石是自动装置必不可少的配件,玩家也可以通过红石来建造各种需要的设备,下面小编就为大家带来我的世界自动售货机红石版制作方法,以及其他两种 ...

    标签:

    我的世界自动售货机 我的世界自动售货机怎么做 我的世界自动贩卖机

    3b1055a15f49b3f957d852707546882d.png

    发布时间:2015-09-19

    我的世界圈地指令1 我的世界领地是可以通过指令相互移交或者进行拆除,PVP等等的,下面蚕豆网小编就为大家带来圈地指令和领地权限指令大全. 总命令 /res ? [页数] - 显示帮助,不写页数则显示第一页. /resad ...

    标签:

    我的世界攻略 我的世界 我的世界圈地指令

    15ec56b5b4c72d1ac3225128ce928e1c.png

    发布时间:2016-07-26

    自动售货机做法(1) 我的世界自动售货机怎么做 我的世界自动售货机教程,下面小编就为大家带来我的世界自动售货机红石版制作方法. 红石自动售货机制作教程 需要材料:红石火把.红石.投掷器.方块.漏斗.比较器.红石灯.箱子 ...

    标签:

    我的世界自动售货机怎么做

    a6926c260ecdd30cff7171744a7713fb.png

    发布时间:2016-07-09

    我的世界lockette插件指令锁箱子方法解析带给玩家,如何保护一个别人打不开的箱子,接下来我的世界lockette插件指令锁箱子方法解析. 在我的世界中我们经常需要搜集资源,当我们搜集资源过后,需要将它放在一个箱子中进 ...

    标签:

    我的世界攻略 我的世界 我的世界lockette插件指令

    ffcd6a83f26dfbef0b269283932f309a.png

    发布时间:2016-08-14

    我的世界封ip指令是什么 我的世界怎么封ip详解.我的世界是近期很热门的游戏.最近有玩家想知道我的世界封ip指令是什么,毕竟有熊孩子在服务器中捣乱非常的令人头疼,那么就请大家一起来看看吧! [ban]

    标签:

    我的世界 游戏攻略 游戏秘籍

    0e95400d24f7d98c67c1948fdd4a5f92.png

    发布时间:2015-10-14

    我的世界 自动售货机制作方法 MC自动售货机怎么制作  我的世界 自动售货机制作方法 MC自动售货机怎么制作 我的世界游戏中自动售货机相信很多玩家都不知道怎么制作吧,今天小编就来给大家讲解一下自动售货机的制作方法,相信一 ...

    标签:

    我的世界自动售货机制作方法 MC自动售货机怎么制作 我的世界怎么制作自动售

    发布时间:2016-02-11

    我的世界自动熔炉怎么做 我的世界自动熔炉制作视频解析.最近有玩家问到我的世界游戏中的自动熔炉该怎么制作,下面小编就给大家分享一位玩家带来的自动熔炉制作方法的视频,一起来看看吧. 自动熔炉制作视频攻略

    标签:

    我的世界 游戏攻略 游戏秘籍

    85de8a8dff2d18fbf2ad7526028b8736.png

    发布时间:2016-02-24

    中玩家们可以利用红石制作全自动酿造机,很多玩家对于制作步骤过程不了解,下面小编为大家介绍一下我的世界自动酿造机怎么做 全自动酿造机制作教程,希望对大家有所帮助,一起来看看吧! 我的世界自动酿造机怎 ...

    标签:

    我的世界 游戏攻略 游戏秘籍

    展开全文
  • QuickShop 旨在结合许多已失效的过期“商店”插件的概念。 该项目的目标是提供一些用户友好的东西,允许玩家通过经济体通过 Minecraft 服务器交易物品。 考虑到目标受众,它必须简单且易于使用。 该插件在概念上是...
  • 微信小程序商店微信小程序商店
  • 全程是JFrmae的,用JDBC连接数据库。 对面计算机专业的同学,可以参考,可以作为自己的期末任务! 最好先运行一遍,大致看一下过程。 然后一点一点的学习。 加油!
  • 海量软件分类清晰简单,工具、视频、音乐、 游戏等,你想要的都在这里 安全软件入库经联想官方认证,杜绝垃圾信息, 给你最放心的使用体 纯净拒绝捆绑“全家桶”,没有多余功能, 一心一意纯净软件商店 ...
  • 支持物品的购买和卖出,代码开源 ,可自行修改,另外附加各种滑动类型的功能
  • java jdbc宠物商店

    2022-04-14 08:26:32
    基于Java jdbc。jsp 开发的宠物商店系统 数据库采用mysql 可毕设
  • 被遗忘的豌豆荚-应用商店和浏览器杂交体.docx
  • weixin--shop 这是用微信开发者工具商店项目 在暑假的时候进行了微信小程序的学习,在学习完小程序后,了商城项目来进行练手
  • unity手游UI界面开发之商店等界面

    千次阅读 2017-04-15 15:59:58
    首先整个大的商店界面Panel,成prefab随便你,也可以,不过我觉得大部分商店的外观还是有点不同,但是商店的种类不多,直接一个界面也行,就几分钟。至于是不是便于维护,拓展什么的不太重要。因为商店的...

    商店在手游中是不可缺少的一部分。通常会有几种商店,比如公会商店,远征商店等。

    这时候就设计到商店界面重用的问题。嗯,跟我后面要做的基于MVC的背包系统也有一点思路相同之处。

    首先整个大的商店界面Panel,做不做成prefab随便你,做也可以,不过我觉得大部分商店的外观还是有点不同,但是商店的种类不多,直接做一个界面也行,就几分钟。至于是不是便于维护,拓展什么的不太重要。因为商店的界面数量太少。

    但重点来了,一个商店里面肯定有商品栏

    而这个是可以重用的,不同商店只是道具名不同,道具图片不同,道具金额及金额类型不同。


    所以思路就是把商品框设置成prefab,而刚刚提到的元素都是在这个prefab生成时随机生成物体id(或固定物体id),再根据id动态加载对应数据(或固定数据)。


    商品框讲完,再讲这个商店中商品栏的滑动效果,通过滑动或者点击(下一页按钮)来查看更多的商品。而手游,首选的交互肯定是滑动。

    滑动则是运用到UGUI中scrollview。把里面的content当成是商品栏,把商品框放入商品栏并给content添加grid layout,即可实现这样的UI效果。

    当然,这些商品是可以点击并弹出相关的细节,如下:

    所以商品框这个prefab应当加上button部件。当然,这个button上挂个脚本,被点时告诉GameManager脚本,当前所点的商品id是什么,万一玩家点击买了就要进行更新。然后在制作这个detailsPanel的时候。它的原理其实跟之前的一样,根据你所点的商品id,动态的赋值给这个detailsPanel上的图片内容,文本内容,金额及类型内容。

    当然,记录了所点的商品id,是为了玩家买了后能在后台更新数据,并在背包中进行更新。在下篇文章,我将会记录开发背包界面的过程。

    还有,当商品被购买:


    把一张售罄的图片(当然是一个prefab啦)instantiate在这个商品框上,并把商品框中button的interactable设置为false 大功告成;


    嗯,还有个刷新的按钮(坑钱必备啊),由于商品框都是prefab,且是动态生成内容的,想实现刷新就非常方便啦。只要把content中的所有子物体destroy,再instantiate随机个商品框即可。


    详细代码就不贴了,毕竟开发每个不同游戏的商店界面都会有点不同,重点是思路要对,跟着思路写脚本也是特别快的,就怕一头雾水地去写脚本。

    展开全文
  • Game_Store 我正在的一个简单的游戏商店项目
  • 如果你看不懂这个App是什么的,说明你还不是一名合格的App开发人员。 美工妹子制作大量应用商店截图模板,然后标注好主标题、副标题、截图坐标、截图尺寸、附件坐标等参数。然后将这些数据整理成json数据,在...
  • 宠物商店.zip

    2019-07-26 02:02:18
    用java一个简单的宠物商店,实现添加,购买,结算等功能
  • 模板名称:免费WordPress 电子商务网络商店主题源码下载 该模板网站很容易吸引访客点击,提升ip流量和pv是非常有利的。 本套模板采用现在非常流行的全屏自适应布局设计,且栏目列表以简洁,非常时尚大气。 页面...
  • autojs一个脚本商店

    千次阅读 2020-06-28 13:07:59
    autojs一个脚本商店
  • 商店6.15.10.88

    2015-01-08 09:15:29
    2、乐豆任务优化,任务更省心! 3、网络诊断优化,诊断更快更准! 4、乐豆商城优化,兑奖竞拍无忧! 5、性能优化以及其他bug处理! ----------------------------------- 6.14新鲜热辣,全新体验等您来试! ...
  • NULL 博文链接:https://tonyliu8731.iteye.com/blog/413165
  • 利用python实现以下功能:基于python下的电子产品商店 电子产品商店 v0.1 请选择商品: ============================= 1 Apple Watch ¥3299.00 ————————————– 2 AirPods ¥1288.00 ————————...
  • 在科学技术日益发达,一切讲求效益的今天,零售商店以人力监视商场的传统防盗方法已不再适宜,取而代之的将是应用高科技的电子商品防盗系统。零售业商品的失窃现象是一个世界性的普遍问题,据国外有关统计资料表明,...
  • 欢迎留言讨论!
  • 处理您的商店和其他物品的收集。 它不是固执己见,不 AJAX,也不是视图,也不是路由等......只一件事,管理你的对象集合并且擅长它。 我根据多年对收藏应该什么的期望创建了该库。 这是我一直需要但找不到的...
  • 这是什么用的? 我们从事在线商店已有很长时间了。 基本上,每个人都在考虑买家。 但是经理呢? 经理不必要地过载了第三方商店中的许多功能。 要执行简单的操作,您需要配置几个不同的设置页面。 为经理添加和...
  • 宠物商店系统SSM

    2018-03-28 15:44:47
    这个是本人初期在补习班花钱过的项目,基于SSm,非常适合新手,里面东西齐全,拿来可用,
  • 今年的毕业设计,附带源程序,数据库文件和环境说明文档,可以用来毕业设计或者课程设计 一份很好的毕业设计
  • 商店管理系统

    2014-05-20 07:15:59
    可用来课程设计 ,毕业设计,本系统是基于struts2、hiibernate的mvc模式来设计完成,数据库用的是MySQL
  • 安卓google商店介绍

    千次阅读 2022-03-29 21:23:41
    大家都知道,国内的安卓手机都是定制版的,阉割了Google相关服务比如谷歌商店(Google Play Store)等。而偏偏很多好玩的游戏或者酷酷的应用都只能通过谷歌市场下载和更新,那么如何使用Google Play 商店呢? 下面我们...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 93,415
精华内容 37,366
关键字:

做商店