Unity实战之方块跑酷(一)

一、初始化项目开发环境

1)项目创建

2)导入NGUI插件

3)相关资源导入

4)Atlas制作(由UI中的图片导入)

二、初始屏幕自适应

原因:Android手机屏幕尺寸不一样,屏幕分辨率千奇百怪

该实战用16:9的分辨率自适应 1920*1080   1280*720  960*540  720*405

三、NGUI初步实现UI自适应

Game面板创建先使用的分辨率尺寸

创建多个分辨率
图标缩小

UIRoot组件相关设置:1)缩放类型,手机自适应 内容宽高度 填写数值,勾选fit

四、开始界面UI


初始界面UI
商城界面UI
游戏界面UI

五、地图生成算法之菱形布局

1)Resources动态加载资源

①新建资源目录“Resources”存放预制体文件。!一定要叫这个名字!

②使用Resources.Load("资源名")进行动态资源加载。

prefabs文件中的地板砖预制体拖到Resources文件夹中,创建一个空物体,讲c#脚本挂载其上

private GameObject m_prefab_tile;

void Start () {

        m_prefab_tile = Resources.Load("tile_white") as GameObject;

}

2)代码生成地图菱形布局

两层for循环嵌套生成长方形的地面效果。

Quaternion.Euler(Vector3)可以将三维向量转换为四元数。

private void CreateMapItem()

    {

        for (int i = 0; i < 10; i++)

        {

            for (int j = 0; j < 5; j++)

            {

                Vector3 pos = new Vector3(j*0.254f, 0, i*0.254f);

                Vector3 rot = new Vector3(-90, 0, 0);

                GameObject tile = GameObject.Instantiate(m_prefab_tile, pos, Quaternion.Euler(rot)) as GameObject;//实例化生成,默认位置,无旋转

                tile.GetComponent<Transform>().SetParent(m_Transform);//设置父物体

            }

        }

    }

修改摄像机参数值,正交模式,活用Transform组件右上角的copy component和paste

3)等腰直角三角形求底边长实现单排菱形平铺

等腰直角三角形求底边:2的平方根 乘以 直角边长

unity代码实现:Mathf.Sqrt(2)*n;

地板转了45°,两块地板之间距离变为斜边,调整SIZE

private void CreateMapItem()

    {

        for (int i = 0; i < 10; i++)

        {

            for (int j = 0; j < 5; j++)

            {

                Vector3 pos = new Vector3(j * Mathf.Sqrt(2) * 0.254f, 0, i * Mathf.Sqrt(2) * 0.254f);

                Vector3 rot = new Vector3(-90, 45, 0);//地板变成斜的了

                GameObject tile = GameObject.Instantiate(m_prefab_tile, pos, Quaternion.Euler(rot)) as GameObject;//实例化生成,默认位置,无旋转

                tile.GetComponent<Transform>().SetParent(m_Transform);//设置父物体

            }

        }

    }

4)菱形地图双排布局

第二排菱形位置需要偏移,偏移量为半个底边长度

//第二排

        for (int i = 0; i < 10; i++)

        {

            for (int j = 0; j < 4; j++)

            {

                Vector3 pos = new Vector3(j * bottomLength + bottomLength / 2, 0, i * bottomLength + bottomLength / 2);

                Vector3 rot = new Vector3(-90, 45, 0);

                GameObject tile = GameObject.Instantiate(m_prefab_tile, pos, Quaternion.Euler(rot)) as GameObject;//实例化生成,默认位置,无旋转

                tile.GetComponent<Transform>().SetParent(m_Transform);//设置父物体

            }

        }

调颜色

当出现高光时,把预制体中的金属度调为0

private Color color1 = new Color(124/255f, 155/255f, 230/255f);

tile.GetComponent<MeshRenderer>().material.color = color1;

 tile.GetComponent<Transform>().FindChild("normal_a2").GetComponent<MeshRenderer>().material.color = color1;//找到子物体,再找他的组件meshrender改颜色,颜色rbg要除以255加个f


两种颜色

将预制体wall,修改金属度,拖入resources文件夹中,在脚本中找到该预制体

因为墙壁没有子物体,所以FindChild这句要放在else里面。↓↓↓↓

墙壁生成完成

六、地图生成算法之数据管理

1)美化瓷砖地图

①摄像机位置与角度调整

②灯光位置与角度一集颜色调整

③墙壁模型重新定义颜色

2)地图数据存储

3)地图数据测试

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

/// <summary>

/// 地图管理器

/// </summary>

public class MapManager : MonoBehaviour {

    private GameObject m_prefab_tile;

    private GameObject m_prefab_wall;

    //地图数据存储

    private List<GameObject[]> mapList = new List<GameObject[]>();

    private Transform m_Transform;

    private float bottomLength = Mathf.Sqrt(2) * 0.254f;

    private Color color1 = new Color(124/255f, 155/255f, 230/255f);

    private Color color2 = new Color(125/255f,169/255f,233/255f);

    private Color color3 = new Color(87 / 255f, 93 / 255f, 169 / 255f);

void Start () {

        m_prefab_tile = Resources.Load("tile_white") as GameObject;

        m_prefab_wall = Resources.Load("wall2") as GameObject;

        m_Transform = gameObject.GetComponent<Transform>();

        CreateMapItem();

}

    /// <summary>

    /// 创建地图元素(段)

    /// </summary>

    private void CreateMapItem()

    {

        //单排

        for (int i = 0; i < 10; i++)

        {

            GameObject[] item = new GameObject[6];

            for (int j = 0; j < 6; j++)

            {

                Vector3 pos = new Vector3(j * bottomLength, 0, i * bottomLength);

                Vector3 rot = new Vector3(-90, 45, 0);

                GameObject tile = null;

                if (j == 0 || j == 5)

                {

                    tile = GameObject.Instantiate(m_prefab_wall, pos, Quaternion.Euler(rot)) as GameObject;//实例化生成,默认位置,无旋转

                    tile.GetComponent<MeshRenderer>().material.color = color3;

                }

                else

                {

                    tile = GameObject.Instantiate(m_prefab_tile, pos, Quaternion.Euler(rot)) as GameObject;//实例化生成,默认位置,无旋转

                    tile.GetComponent<Transform>().FindChild("normal_a2").GetComponent<MeshRenderer>().material.color = color1;

                    tile.GetComponent<MeshRenderer>().material.color = color1;

                }

                tile.GetComponent<Transform>().SetParent(m_Transform);//设置父物体

                item[j] = tile;

            }

            mapList.Add(item);

            //第二排

            GameObject[] item2 = new GameObject[5];

            for (int j = 0; j < 5; j++)

            {

                Vector3 pos = new Vector3(j * bottomLength + bottomLength / 2, 0, i * bottomLength + bottomLength / 2);

                Vector3 rot = new Vector3(-90, 45, 0);

                GameObject tile = GameObject.Instantiate(m_prefab_tile, pos, Quaternion.Euler(rot)) as GameObject;//实例化生成,默认位置,无旋转

                tile.GetComponent<MeshRenderer>().material.color = color2;

                tile.GetComponent<Transform>().FindChild("normal_a2").GetComponent<MeshRenderer>().material.color = color2;

                tile.GetComponent<Transform>().SetParent(m_Transform);//设置父物体

                item2[j] = tile;

            }

            mapList.Add(item2);

        }


    }

void Update () {

        if (Input.GetKeyDown(KeyCode.Space))

        {

            string str = "";

            for (int i = 0; i < mapList.Count; i++)

            {

                for (int j = 0; j < mapList[i].Length; j++)

                {

                    str += mapList[i][j].name;

                }

                str += "\n";

            }

            Debug.Log(str);

        }

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • 一、Unity简介 1. Unity界面 Shift + Space : 放大界面 Scene界面按钮渲染模式2D...
    MYves阅读 8,180评论 0 22
  • 这是今天的成果吧,虽然还是没有全部完成,但是大致的功能已经实现,飞机的移动,限制移动范围,子弹的发射,消灭敌人,敌...
    Unity学习的路上阅读 2,833评论 1 2
  • 年初的时候是没有什么计划的。每天按部就班的上下班,也没有时间和精力去想什么了。2018年过去一半了,现在时间充裕,...
    零落花泥阅读 330评论 0 2
  • 时间会懂得 并不是所有的努力付出都会有回报。 有些事,就算拼尽全力 却发现别人轻而易举完成你不能完成的事。 但是,...
    我们的青春不后悔阅读 118评论 0 0
  • 引言 众所周知,数据挖掘算法并非十全十美,在某些情况下他们也会失效。 使用 K 均值算法(K-Means)时就可能...
    Datartisan数据工匠阅读 503评论 0 3