• [3]尝试用Unity3d制作一个王者荣耀(持续更新)->选择英雄-(中)


    如果已经看过本章节:目录传送门:这是目录鸭~

    上节内容写了Actor管理器,那么这一节让我们先创建一个角色。(此章节开始加速...)

    1.制作角色展示AssetBundle:

    提取农药某个展示模型(Show)资源(这步具体去百度),然后再把模型制作成预制体,AssetBundle命名规则按照农药的(ID_游戏拼音_资源类型.assetbundle):

    制作UI预制体,还是得提取或者去农药官网 pvp.qq.com 的壁纸中心下载原图截取(一个是图标一个是加载时候用到的):

    创建一个空物体,并挂上ActorInfo组件,制作成预制体并输入数据(虽然标签以及打包的文件都是小写的,但按照路径读取文件的时候不会区分大小写,为了好看于是可以大写):

    到这步先不要打包,后面还有小部件需要打包的。

    2.拼UI(最舒适的部分~):

    创建一个滚动视图,并且在Content位置增加自动布局组件,再创建空对象改名Mode,里面存放两个按钮用来切换皮肤和英雄选择,如图:

    拉几下几下位置,最终效果:

    然后我们制作一个预制体,用于动态生成(结构是一个空物体里面有个按钮(已把里面文字删去)和一个 名字 的 文本显示组件):

    把预制体粘贴到Content里面测试有没有问题(是否自动对齐):

    测试放上去的内容记得删除,设置预制体标签:

    然后我们写一个代码用于管理选择英雄的UI响应的(前SelectionListManager)和 按钮回调的(后HeroItemButton):

     1 /*
     2  * 编辑者:Miku酱
     3  * 版本:1
     4  * 首次编写日期:2019/09/20 00:05
     5  * 修改日期:2019/09/20 00:05
     6  * 强行加一行~~~
     7  */
     8 using System.Collections;
     9 using System.Collections.Generic;
    10 using UnityEngine;
    11 using LuoHao.Actor;
    12 using UnityEngine.UI;
    13 using LuoHao.AssetBundleManager;
    14 
    15 namespace LuoHao.PVP.Selection
    16 {
    17     public class SelectionListManager : MonoBehaviour
    18     {
    19         public Transform testPos;
    20 
    21         /// <summary>
    22         /// 接口
    23         /// </summary>
    24         public static SelectionListManager selectionListManager;
    25 
    26         /// <summary>
    27         /// UI的AB包路径
    28         /// </summary>
    29         static string uiPath = "UGUI_Selection_0.assetbundle";
    30         [Header("父对象")]
    31         public Transform UIparent;
    32         /// <summary>
    33         /// 当前选择的英雄ID
    34         /// </summary>
    35          private int nowSelectionID = -1;
    36 
    37         GameObject testGM = null;
    38         /// <summary>
    39         /// 设置ID
    40         /// </summary>
    41         /// <param name="id">id</param>
    42         public void SetSelectionID(int id)
    43         {
    44             if (nowSelectionID == id) return;
    45            nowSelectionID = id;
    46             if (testGM != null) Destroy(testGM);
    47             Transform tr = Instantiate(AssetBundleManager.AssetBundleManager.
    48                 GetAssetBundle(ActorManager.allActor[id].actorSkins[0].skinShowModelPath+ ".assetbundle")
    49                 .GetAssetBundle().LoadAllAssets<GameObject>()[0],testPos).transform;
    50             tr.localPosition = Vector3.zero;
    51         }
    52         
    53         public int GetSelectionID()
    54         {
    55             return nowSelectionID;
    56         }
    57 
    58         private void Awake()
    59         {
    60             selectionListManager = this;
    61             nowSelectionID = -1;//重置ID
    62         }
    63         // Start is called before the first frame update
    64         private void Start()
    65         {
    66             LoadList();
    67         }
    68 
    69         // Update is called once per frame
    70         private void Update()
    71         {
    72 
    73         }
    74         
    75         private void LoadList()
    76         {
    77             //取得预制体
    78             GameObject btn =AssetBundleManager.AssetBundleManager.
    79                 GetAssetBundle(uiPath).GetAssetBundle().LoadAsset<GameObject>("HeroBtn");
    80             List<ActorInfoData> infos = new List<ActorInfoData>(ActorManager.allActor.Values);//取得信息...
    81             for(int i = 0; i < infos.Count; i++)//创建UI
    82             {
    83                 PackageForAssetBundle sprite = AssetBundleManager.AssetBundleManager.
    84                     GetAssetBundle(infos[i].actorSkins[0].skinIconPath+".assetbundle");
    85                    //取得图标资源
    86                 Transform tr = Instantiate(btn, UIparent).transform;
    87                 tr.GetComponentInChildren<Text>().text = infos[i].actorName;//设置名字
    88                 tr.GetComponentInChildren<Image>().sprite= sprite.GetAssetBundle().LoadAllAssets<Sprite>()[0]; //设置图标
    89                 tr.GetComponentInChildren<HeroItemButton>().heroID = infos[i].actorID;//设置ID
    90                 sprite.UnLoadAssetBundle(false);//卸载
    91             }
    92         }
    93     }
    94 }

     

     1 /*
     2  * 编辑者:Miku酱
     3  * 版本:1
     4  * 首次编写日期:2019/09/20 00:05
     5  * 修改日期:2019/09/20 00:05
     6  * 强行加一行~~~
     7  */
     8 using System.Collections;
     9 using System.Collections.Generic;
    10 using UnityEngine;
    11 
    12 namespace LuoHao.PVP.Selection
    13 {
    14     public class HeroItemButton : MonoBehaviour
    15     {
    16         /// <summary>
    17         /// 这个由代码来设置
    18         /// </summary>
    19         [HideInInspector]
    20         
    21         public int heroID = 0;
    22         public void OnClick()
    23         {
    24             SelectionListManager.selectionListManager.SetSelectionID(heroID);//调用更改ID
    25             
    26         }
    27     }
    28 }

    然后在回到按钮,挂上HeroItemButton并设置按钮回调OnClick:

    再再选择英雄的场景中创建一个空物体(SelectionListManager),拖入展示位置和滚动视图的Content:

     

    3.试运行:

    这时候我们点击一下AssetBundle打包,让程序飞一会~

    在一个用于测试的空对象(没有就创建)挂上ActorManager:

    并输入刚刚创建的阿离的ActorInfo文件的位置(这里就要带后缀了,可以通过修改代码来免除加后缀):

    然后运行:

    我这边因为临时写了个动画的管理的所以有出场动画展示,这个后面才讲。

    出现了动图里面的效果就说明成功啦!

    不早了( 2019/09/20 00:30),下一节再见。

    如果已经看过本章节:目录传送门:这是目录鸭~

     

  • 相关阅读:
    Notepad++ 使用nppexec插件配置简易开发环境
    Notepad++一键编译运行(Python、Java、C++)
    Java翁恺(1)——下载安装
    stm32正点原子学习笔记(30)窗口看门狗
    小程序模板
    Wireshark使用介绍(二):应用Wireshark观察基本网络协议
    Wireshark使用介绍(一):Wireshark基本用法
    Git 教程(四):标签和其他
    Git 教程(三):仓库与分支
    Git 教程(二):提交和回退
  • 原文地址:https://www.cnblogs.com/Miku-CEB-Bug/p/11553452.html
Copyright © 2020-2023  润新知