欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-29 10:27:36
如果已经看过本章节:目录传送门:这是目录鸭~ 1.场景搭建: 首先我们去AssetStore逛淘宝~~~ 我淘到的是这个资源,其他好看的场景(消耗不高的都行)。 然后我们导入了这个资源后,把资源根文件夹的名字改为Select,把Demo场景文件的名字改为Selection,我这样修改的emmm... ......

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

1.场景搭建:

首先我们去assetstore逛淘宝~~~

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

我淘到的是这个资源,其他好看的场景(消耗不高的都行)。

然后我们导入了这个资源后,把资源根文件夹的名字改为select,把demo场景文件的名字改为selection,我这样修改的emmm...

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

然后打开那个demo场景,走到lightningsetting关闭雾效果(这个消耗有点大,关一下,你开心也可以不关的~):

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

然后我们就在场景里移动main camera到你喜欢的好看的位置~

顺便创建个reflection probe(反射效果的):

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

前面是没加的,后面是加了的,区别有点小,仔细看右边的更漂亮诶~~~

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

然后我们在场景中创建空对象,重新命名为你喜欢的名字,用于展示英雄的角色坐标的定位,我在里面放了个阿离并把相对坐标设置为零来测试站的位置是否准确(我这里面还有个光照是因为脸部比较暗,你可以自己调整光照的,对~说的就是你o(*^▽^*)o):

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

到此为止~我们的场景就搭建完毕了亲亲~

2.英雄资源的打包相关(重要!!!):

命名规则:我们可以看到,农药的assetbundle命名结构是:英雄id+皮肤编号(没有空格,比如说阿离的id是199,这个花间舞是第二个皮肤,所以id为1992,第一个默认皮肤不需要输入皮肤id就199就好了)_英雄拼音_资源类型.assetbbundle。(下面可以看到廉颇id是105,这个设定使得我们提资源十分方便~良心tx~):

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

然后我们也打算用这种规则来命名~

下面部分含有代码~

创建几个新文件夹在根工程目录下,路径是 actormanager/scripts,然后再在里面创建一个csharp(即c#),名为actormanager:

/*
 * 编辑者:miku酱
 * 版本:1
 * 首次编写日期:2019/09/15 13:53
 * 修改日期:2019/09/15 13:53
 * 强行加一行~~~
 */

using system.collections;
using system.collections.generic;
using unityengine;
using luohao.assetbundlemanager;

namespace luohao.actor
{
    public class actormanager : monobehaviour
    {
        /// <summary>
        /// 角色信息文件的列表
        /// </summary>
        [textarea]
        public list<string> actorfilelist = new list<string>();
        /// <summary>
        /// 全部的角色信息
        /// </summary>
        public static dictionary<int, actorinfodata> allactor = new dictionary<int, actorinfodata>();

        private void awake()
        {
            loadallactor();//加载
            dontdestroyonload(this.gameobject);//切换场景不销毁这个物体
        //    debug.log(allactor[100].actorname);//测试
           
        }
        /// <summary>
        /// 加载角色信息
        /// </summary>
        public bool loadallactor()
        {
            for(int i = 0; i < actorfilelist.count; i++)
            {
                //取得文件
             packageforassetbundle pfa=   assetbundlemanager.assetbundlemanager.getassetbundle(actorfilelist[i]);
                //加载资源
                gameobject[] gms = pfa.getassetbundle().loadallassets<gameobject>();
                actorinfo[] ai = gms[0].getcomponents<actorinfo>();
                if (ai.length == 0)//数组长度为0则返回错误
                {
                    debug.logerror("加载角色信息文件失败!\n错误文件位置:"+actorfilelist[i]);
                    return false;
                }
                else
                {
                    for (int i1 = 0; i1 < ai.length; i1++)
                        allactor.add(ai[i1]._actorinfodata.actorid, ai[i1]._actorinfodata);
                    //信息载入字典....
                }
                pfa.unloadassetbundle(true);//卸载ab包
            }
            
            return true;
        }
       
    }
    
    /// <summary>
    /// 储存单个角色信息的类
    /// </summary>
    [system.serializable]//序列化,注意要用system命名空间下面的
    public class actorinfodata
    {
        /// <summary>
        /// 角色名字
        /// </summary>
        public string actorname = "英雄名字";
        /// <summary>
        /// 角色拼音
        /// </summary>
        public string actorpinyin = "pinyin";
        /// <summary>
        /// 角色id
        /// </summary>
        public int actorid = 100;
        /// <summary>
        /// 屏蔽英雄
        /// </summary>
        public bool banactor = false;
        /// <summary>
        /// 角色背景
        /// </summary>
       [textarea]//这个是文本框,显示在编辑器的
        public string actorbg = "背景故事";

        /// <summary>
        /// 皮肤列表(第一个就是原皮,必填)
        /// </summary>
        public list<actorskin> actorskins = new list<actorskin>();
        
    }
    /// <summary>
    /// 储存单个皮肤的
    /// </summary>
    [system.serializable]//序列化
    public class actorskin
    {
        /// <summary>
        /// 皮肤名字
        /// </summary>
        public string skinname = "皮肤名字";
        /// <summary>
        /// 皮肤展示模型资源路径
        /// </summary>
        [textarea]//这个是文本框,显示在编辑器的
        public string skinshowmodelpath = "皮肤展示模型资源路径";
        /// <summary>
        /// 皮肤对战模型资源路径
        /// </summary>
        [textarea]//这个是文本框,显示在编辑器的
        public string skinbattlemodelpath = "皮肤对战模型资源路径";
        /// <summary>
        /// 皮肤展示特效资源路径
        /// </summary>
        [textarea]//这个是文本框,显示在编辑器的
        public string skinshoweffectpath = "皮肤展示特效资源";
        /// <summary>
        /// 皮肤对战特效资源路径
        /// </summary>
        [textarea]//这个是文本框,显示在编辑器的
        public string skinbattleeffectpath = "皮肤对战特效资源";
    }
}

脚本actorinfo(承载信息的载体):

 1 /*
 2  * 编辑者:miku酱
 3  * 版本:1
 4  * 首次编写日期:2019/09/15 13:53
 5  * 修改日期:2019/09/15 13:53
 6  * 强行加一行~~~
 7  */
 8 
 9 using system.collections;
10 using system.collections.generic;
11 using unityengine;
12 
13 namespace luohao.actor {
14     public class actorinfo : monobehaviour
15     {
16         [header("角色信息")]
17         public actorinfodata _actorinfodata;
18     }
19 }

 

 

创建角色信息数据库:

新建一个物体,并挂上脚本actorinfo,修改信息(你开心就好随便想改啥就改啥~),然后制作成预制体并且设置标签:

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

然后在点击工具栏的打包assetbundle的按钮,打包这个预制体,最后我们在场景中随便找个物体挂上actormanager,并增加一个路径(就是你预制体标签的名字加后缀,标签默认是全部小写,我们设置的时候大小写不影响文件读取):

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

如果运行后unity编辑器毫无波澜甚至有点想笑的话那就说明这步ok啦~

施工了一个中午emmm~头发又少了几根,下一部分再见咯~

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