[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),下一节再见。

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

 

相关推荐:

如何在 QGraphicsView 中实现持续缩放与平移(支持实时图像流)

本文介绍如何为基于pyqt5的实时图像显示控件(qgraphicsview)添加稳定、不重置的鼠标滚轮缩放和平移功能,解决动态更新图像时缩放状态丢失的问题。 本文介绍如何为基于pyqt5的实时图像显示控件(qgraphicsview)添加稳定、不重置的鼠标滚轮缩放和平移功能,解决动态更新图像时缩放状...

怎样用Python判断文件编码是否为GBK_尝试decode捕获异常

直接用decode()捕获异常判断GBK编码不可靠,因非法序列可能部分解码成功或合法数据因截断误报错;应先验证字节合法性再排除干扰编码,生产环境优先使用charset_normalizer。 用decode()捕获异常判断是否为GBK编码不可靠 直接对字节流调用b''.decode('gbk')并捕...

Python Tkinter如何处理键盘长按事件_通过定时器实现持续触发

KeyRelease比KeyPress更适合长按检测,因其可精准控制定时器启停,避免系统重复触发的不可控性,并支持跨平台一致的长按时长判断。 为什么KeyRelease比KeyPress更适合长按检测 因为Tkinter的KeyPress事件在系统级键盘重复开启后会高频触发(取决于系统设置),但不可...

如何在密码验证循环中精准控制尝试次数提示的显示时机

本文详解如何在基于while循环的密码验证程序中,仅在失败时输出剩余尝试次数,避免成功登录后误显计数信息,并提供结构清晰、逻辑严谨的优化实现方案。 本文详解如何在基于while循环的密码验证程序中,仅在失败时输出剩余尝试次数,避免成功登录后误显计数信息,并提供结构清晰、逻辑严谨的优化实现方案。 在实...

Python怎么读取日志文件_尾部持续读取类似tail -f实现

最稳妥方案是用watchdog库监听目录,结合文件名模式与修改时间动态切换读取目标,并用缓冲区拼接跨readline的多行日志。 用time.sleep()轮询文件末尾是最简单但要注意CPU占用 Python没有内置的阻塞式“tail-f”等价物,最直接的做法是循环检查文件大小变化,读新内容。核心逻...

如何在Python中将两个循环合并以基于前一个循环结果持续执行计算

本文详解如何正确嵌套循环结构,确保后续计算(如模型训练与r²评估)对前一循环生成的每个随机数独立执行,避免仅使用最后一个值的常见缩进错误。 本文详解如何正确嵌套循环结构,确保后续计算(如模型训练与r²评估)对前一循环生成的每个随机数独立执行,避免仅使用最后一个值的常见缩进错误。 在您的原始代码中,问...

Pandas 时间序列中识别持续 ≥30 秒的有效事件(容忍中间零值)

本文介绍如何在pandasdataframe中精准识别时间序列中的“有效事件”:要求事件整体跨度≥30秒,允许内部出现零值,但连续零值≥30秒即视为事件终止;首尾孤立的短时非零段不构成事件。 本文介绍如何在pandasdataframe中精准识别时间序列中的“有效事件”:要求事件整体跨度≥30秒,允...