精华内容
参与话题
问答
  • unity编写一个简单的小游戏

    万次阅读 多人点赞 2018-12-22 21:15:01
    unity编写一个简单的小游戏简易fly bird的制作关于flybird场景的搭建和素材的导入使用素材搭建game和scene制作柱体bird的scriptcolumn的spritecolumn的生成游戏判定游戏结束画面结语 简易fly bird的制作 关于flybird...

    简易fly bird的制作

    关于flybird

    这个游戏想必大家都玩过,今天我们要使用unity来写一个差不多的fly bird,需要unity和vs的配合,这个游戏规则就是控制一个bird通过一个个柱体之间的缝隙。在这里插入图片描述

    场景的搭建和素材的导入

    打开unity,选择文件路径,因为这个游戏是2D的,选择2D后我们create。素材对于我们学生党很难搞,我们百度asset store就找到unity为我们提供素材的地方,在搜索栏搜索bird就好了,在筛选的位置选择价格免费,很方便的,在里面随便选一个bird就好了,import到你的unity项目里。觉得这个素材质量不太好的,自己可以使用ps在网图上面扣下来自己想要的bird。在这里插入图片描述

    使用素材搭建game和scene

    在你的素材包选择你喜欢的bird拖入scene中,我们要完成一个fly的bird,我们需要借用unity中的刚体,就是给bird在右侧的inspector加上脚本Rigidbody 2D。
    这样这个bird就具有我们想让他有的自然下落等一系列物理条件
    运行一下可以看到bird的自然下落,就ok了
    我们的bird在游戏里不可能是一直下落的,这样需要我们给这个场景加上一个边界。我是直接使用ps弄了一个白色柱体(你还可以使用unity自带的素材,也可以按上面导入),游戏边界我们让他有什么条件呢,让他是个类似实体平面,可以让bird停留在上面这时候使用collider2D这个属性(当然我们的bird上也必须有这个collider,里面有个polygon collider2D这个很适合这种不规则形状的物体),先对一个柱体完成上面的操作 剩下的复制(ctrl+d就可以直接复制)就好了 (横竖不一样,调节z的角度为90就OK了),将边框完成。运行一下发现bird会落在白色边界上,这样场景就搭建好了。

    制作柱体

    我们还是使用上面的白色柱体(不喜欢的可以自己随便导入柱体,没有影响的),对柱体加上collider(我们游戏规则,bird必须在两个柱体之间的缝隙通过,两个柱体是不可以穿过),ok后复制一个,调整二者的位置,形成我们想得到的样子,然后我们右键建一个gameobject并命名为column,将上面建好的两个柱体拖到这个column里面,在column上(注意不要点在那两个柱体上)增加一个box collider2D并使用edit collider,然后对这个的is trigger进行勾选(这个的意思让bird可以在这个之间的collider通过,方便我们后面编写script进行计分),让column成为这样并拖入assets中即可成为我们的素材(毕竟以后我们要不断的生成column):
    在这里插入图片描述

    bird的script

    现在开始我们快乐的edit script环节,在assets右键生成一个文件夹,命名为code,在code里面create一个c# script命名为birdcontrol(这几步最好一次完成,否则到时候加脚本到bird上会出现找不到脚本的bug,真的莫名其妙),打开这个birdcontrol,我们会看到自动生成的代码里面有两个函数(可以使用的函数有4个,每一个的具体含义自己百度,我就不赘述了)
    将下面的代码拖到bird的inspector中,对speed赋值,通过空格键,操作bird的移动。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class birdcontrol : MonoBehaviour
    {
    
        Rigidbody2D bird;
    
        public float speed;                                         //使用speed方便在项目里面选择一个合适的倍数
    
        // Use this for initialization
        void Start()                                                //游戏一开始就会调用的函数
        {
            bird = GetComponent<Rigidbody2D>();                     //将游戏里面的bird引入
        }
        // Update is called once per frame
        void Update()                                               //游戏每一帧都会调用的函数
        {
            if (Input.GetKeyDown("space"))
            {
                bird.AddForce(new Vector2(0, 2 * speed));           //vector2相当于一个有xy的矢量
            }
        }
    }
    
    

    column的sprite

    我们完成了bird在竖直方向的移动控制,接下来要完成在水平方向的移动,总所周知运动是相对的,我们可以通过让column的移动,来完成水平方向的移动,让他以一个均匀的速度自动向右移动translation。
    还有当bird通过column时会加一分,这时候使用ontriggerexit2D这个函数来判断。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class columncontrol : MonoBehaviour {
        public float speed;
    	// Use this for initialization
    	void Start () {
    		
    	}
    	
    	// Update is called once per frame
    	void Update () {
            this.transform.Translate(new Vector2(-speed,0));
    	}
    
        private void OnTriggerExit2D(Collider2D collision)
        {
            if (collision.gameObject.tag == "player")
            {
                Debug.Log("1");
            }
        }
    }
    
    

    column的生成

    游戏中不可能只有一个柱体,而且也需要他的上下变动,这时候我们需要在游戏的最右端的一个位置不断地生成位置随机的column,这时候我们需要给他一个生成点spawnpoint,右键一个empty,命名为spawnpoint,然后我们为他添加脚本

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class spawn : MonoBehaviour {
    
        public GameObject column;
        public float colddown = 2f;
        public float NextSpawn;
    	// Use this for initialization
    	void Start () {
    		
    	}
    	
    	// Update is called once per frame
    	void Update () {
            if (Time.time > NextSpawn)
            {
                NextSpawn = Time.time + colddown;
    
                Vector3 spawnP = transform.position;
                spawnP.y += Random.Range(3.0f, -3.0f);
                Instantiate(column, spawnP,transform.rotation);
            }
    	}
    }
    
    

    最后别忘记将column应用上去
    在这里插入图片描述

    游戏判定

    我们都知道当这个bird碰到墙壁,柱体上,游戏都是失败,这时候就会停止游戏,所以我们给他一个hitted和GM的脚本进行判断(hitted是要添加到ground和column上)

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    //GM.cs
    public class GM : MonoBehaviour {
    
        public static int score = 0;
    
        public static bool Active = true;
    
    	// Use this for initialization
    	void Start () {
    		
    	}
    	
    	// Update is called once per frame
    	void Update () {
    		
    	}
    }
    
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    //hitted.cs
    public class Hitted : MonoBehaviour {
    
    	// Use this for initialization
    	void Start () {
    		
    	}
    	
    	// Update is called once per frame
    	void Update () {
    		
    	}
    
        private void OnCollisionEnter2D(Collision2D collision)
        {
            if (collision.gameObject.tag == "Player")
            {
                GM.Active = false;
            }
        }
    }
    
    

    一旦bird与其碰上就会立刻停止column的运动和生成,所以我们在上面的也要相应的修改

    if (GM.Active)		//columncontrol.cs
            {
                this.transform.Translate(new Vector2(-speed, 0));
            }
    
    if (Time.time > NextSpawn&&GM.Active)	//spawn.cs
            {
                NextSpawn = Time.time + colddown;
    
                Vector3 spawnP = transform.position;
                spawnP.y += Random.Range(3.0f, -3.0f);
                Instantiate(column, spawnP,transform.rotation);
            }
    

    游戏结束画面

    右键在UI里面选择text,并把其命名为score(用于显示分数)再canvas里面再新建一个text,命名为gameover(显示Game Over!),并在上面的active位置把勾取消(不显示文本,当游戏结束时才会出现),下面是UI.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class UI : MonoBehaviour {
        public GameObject gameover;
        public Text score;
    	// Use this for initialization
    	void Start () {
    		
    	}
    	
    	// Update is called once per frame
    	void Update () {
    
            score.text = "Score" + GM.score;
    
            if (!GM.Active)
            {
                gameover.SetActive(true);		//这里会让gameover显示	
            }
    	}
    }
    
    

    UI.cs要添加到canvas上并在相应的位置把score和gameover应用上去。在这里插入图片描述

    结语

    这个flybird较为简单,但是动手实践的时候会让你受益颇多,也是方便你入门的一个程序,我是用的unity和vs的组合比较方便,至于怎么配置的环境和他们之间的关系,百度一下就好了。

    展开全文
  • unity3D实现小游戏案例--弹开小球

    千次阅读 2019-10-10 21:12:21
    游戏大概: 游戏运行时,点击鼠标左键,生成绿色小球,并朝红色方块飞来。点击鼠标右键,红色方块跳起。当红色方块与绿色小球相撞时,绿色小球被弹开。 游戏运行效果: 游戏实现细节: 控制方块代码: ...

    游戏大概:

    游戏运行时,点击鼠标左键,生成绿色小球,并朝红色方块飞来。点击鼠标右键,红色方块跳起。当红色方块与绿色小球相撞时,绿色小球被弹开。

     

    游戏运行效果:

     

    游戏实现细节:

     

    控制方块代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class player1 : MonoBehaviour
    {
        protected float jump_speed = 12.0f;
        public bool is_landing = true; //用来判断发现碰撞时是否为与与地面相撞(也可能是与小球相撞)
    
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
    
            if (this.is_landing)  //使得落地后才能再次弹起,而不能在空中再次弹起。
            {
    
                if (Input.GetMouseButtonDown(0))
                {
    
                    this.is_landing = false;
                    //this.GetComponent<Rigidbody>().velocity = new Vector3(0.0f, 12.0f, 0.0f);
                    this.GetComponent<Rigidbody>().velocity = Vector3.up * this.jump_speed;
                }
            }
        }
    
        void OnCollisionEnter(Collision collision)  //和其他游戏对象发生碰撞时调用的方法。
        {
            if (collision.gameObject.tag == "Floor")
            {
    
                this.is_landing = true;
            }
        }
    }

     

    控制小球代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Ball : MonoBehaviour
    {
    
        // Use this for initialization
        void Start()
        {
    
            this.GetComponent<Rigidbody>().velocity = new Vector3(10.0f, 9.0f, 0.0f);
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
        
        void OnBecameInvisible()  //在游戏对象移动到画面之外不再被绘制时调用的方法。
        {
            Destroy(this.gameObject);  //删除跑出画面之外的小球。
        }
        
    }

     

    发射台(空游戏对象):

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Launcher : MonoBehaviour
    {
    
        public GameObject ballPrefab;
    
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
    
            if (Input.GetMouseButtonDown(1))
            {
    
                Instantiate(this.ballPrefab);  //通过预设生成游戏对象实例的方法。
            }
        }
    }

     

    让方块不被弹开:

     

    选择项目视图中的 Ball 预设。打开 Rigidbody 标签,将 Mass 项的值由 1 改为 0.01.

    Mass 值用于设定游戏对象的重量。两个游戏对象发生碰撞时,Mass 值较大的物体将保持原速度继续运动,Mass 值较小的物体则容易因为受到冲击而改变移动的方向。

     

     

    让小球强烈反弹(设置物理材质):

     

    首先创建物理材质,选择创建 Physic Material. “物理材质” 用于设定弹性系数和摩擦系数等与物理运动相关的属性。

    在项目视图中选择新创建的 Physic Material 后,在检视面板中选择 Bounciness , 将其值由0 改为 1 。 这个值越大,游戏对象就越容易被 “弹开”。

    再把这个 Physic Material 加到小球的预设中就行了。

     

     

    消除 “漂浮感”(调整重力大小):

     

    unity3D 在处理数字时,并未特别指定按照米或者厘米为单位进行计算。目前方块和小球的尺寸值都是1. 也就是说现在游戏中,方块的边长为1米,小球的直径为1米。因此现在看到的游戏对象下落速度都比较缓慢,为了消除这种感觉,我们可以减小游戏对象尺寸,也可以增加重力值。

    增加重力值:    在窗口顶部菜单中依次点击 Edit ----> Project Settings ----> Physics, 检视面板中将切换显示 PhysicsManager. 将 Gravity 项的 “Y” 值稍微提高一些,比如设为 -20(注意负号),就可以增加重力值了。

     

    展开全文
  • Unity3D游戏开发——塔防小游戏

    万次阅读 2017-08-07 08:52:59
    游戏效果图: 本文参照siki学院的塔防游戏教程写的。http://www.sikiedu.com,搜索塔防游戏登入即可观看。 游戏流程: 1.首先创建cube调整其大小(以便计算),然后将其设成预设体(以便之后统一操作),利用...

    游戏效果图:


    本文参照siki学院的塔防游戏教程写的。http://www.sikiedu.com,搜索塔防游戏登入即可观看。

    游戏流程:

    1.首先创建cube调整其大小(以便计算),然后将其设成预设体(以便之后统一操作),利用ctrl+D复制弄出地形,在Hierarchy视图上创建一个map文件夹保存其文件。然后在地形内删除cube,创出自己想要的敌人行走路径。

    2.在每个转折处设置一个Gameobject文件夹,然后在Transform上放修改一种颜色(以便区分),

    将其命名为Waypoint并设置成预设体,创建一个Waypoint文件夹保存所有的Waypoint。在预设体上加上脚本Waypoint:

    public class Waypoint : MonoBehaviour {
        public static Transform[] p;//定义数组
        private void Awake()//在脚本执行时执行
        {
            //获取每个数组的参数,也就是节点位置
            p = new Transform[transform.childCount];
            for (int i = 0; i < p.Length; i++) {
                p[i] = transform.GetChild(i);
            }
        }
    }

    在Scence场景上新建一个Sphere(当成敌人)然后将其放在起点,加上脚本Enemy:

    public class Enemy : MonoBehaviour {

        public float speed = 10;//设置敌人的速度
        private Transform[] p;//定义数组

    void Start () {
            p = Waypoint.p;//调用Waypoint脚本获取节点的位置信息
        }

    void Update () {
            Move();//每一帧执行方法
    }

    void Move() {
            transform.Translate((p[index].position-transform.position).normalized*Time.deltaTime*speed);//移动,节点到当前位置的向量差的单位差*完成上一帧的时间*速度

            if (Vector3.Distance(p[index].position, transform.position) < 0.2f)//三维坐标,距离(节点,当前位置)小于0.2f的时候执行
            {
                index++;//增加索引,也就获取到下个节点坐标
                if (index > p.Length - 1)//如果大于最后一个节点时执行
                {
                    Destroy(this.gameObject);//销毁物体
                }
            }
        }

    }

    这样就能让物体按照指定的坐标移动起来。

      3. 控制游戏的视野(设置摄像机),首先把摄像机调整到一个合适的状态(向上移动一定的位置,x轴旋转45°),之后来用脚本控制摄像机的移动,添加脚本Move():

    public class move : MonoBehaviour {
    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
            float a = Input.GetAxis("Horizontal");//当按下的左右方向(a,d 方向键的左右 4,6)时获取到一个-1到1的值
            float b = Input.GetAxis("Vertical");//当按下的上下方向(w,s 方向键的上下 8,2)时获取到一个-1到1的值
            float m = Input.GetAxis("Mouse ScrollWheel")*-8;//鼠标滚轮缩放
            transform.Translate(new Vector3(a,m,b)*Time.deltaTime*50,Space.World);//转为世界坐标移动
    }
    }

    4.创建一个Gameobject命名为fuhuaqi代表敌人孵化器(用来控制敌人的生成),首先写一个封装类来保存每一波敌人的类型,总数,速度,封装类命名为Bo:

    [System.Serializable]//可序列化,就是能被其他代码引用的意思
    public class Bo {
        public GameObject e;//敌人的类型
        public int count;//敌人的总数
        public float rate;//每个敌人的间隔
    }

    之后再fuhuaqi上写上控制敌人生成的脚本Enemyfuhuaqi:

    public class Enemyfuhuaqi : MonoBehaviour {

        public Bo[] b;//封装类
        public Transform start;//定义开始位置
        public float jiange = 3;//每波的间隔

        private Coroutine coroutine;//定义协同,方便控制协同的启动和停止

        void Start () {
           coroutine= StartCoroutine(Move());//启动协程
        }

        public void Stop()
        {
            StopCoroutine(coroutine);//停止协程
        }

    //协程
        IEnumerator Move() {
            foreach (Bo b in b)
            {
                for (int i = 0; i < b.count; i++)//循环生成
                {
                    GameObject.Instantiate(b.e,start.position,Quaternion.identity);//创建(生成种类,生成位置,不旋转)
                    if (i != b.count - 1)
                    {
                        yield return new WaitForSeconds(b.rate);//协程中的等待(同样敌人的间隔)
                    }
                }    
               yield return new WaitForSeconds(jiange);//完成一波后等待间隔的时间
        }

    }

    写好脚本后记得给相对应的东西赋值!

    5.右键点击Assets->import package->custom package选择载好的材料包,将建筑模型拖入Scence然后在Transform的右侧的齿轮Reset,调整位子(注:选中模型里面所有子物体进行调整,因为之后要按照模型定位与地图方块的地位相同,不让其陷入地板),给对应的位置上材质。做好后设置成Prefab。

    6.开始设置UI界面,首先创建一个Canvas(画布),点击Scence上的2D按钮界面会变成2D界面比较容易操作,在画布里在创建一个Gameobject(名称:Switch)在其下创建3个Canvas存放炮塔的图标在其下再创建image(名:background)和text(用来存放炮塔的图标图片和价格)在其background下创建image(名:Checkmark 用来表示被选中状态)将其中Soure image 属性改成Knob然后改变颜色改变透明度

    给Switch添加属性Toggle group将每个炮塔添加属性Toggle并is on属性都取消,将Checkmark拖入Graphic,将Group都设置成Switch(表示在一个组里面)

    7.在主Canvas下创建Text(名:money)用来显示当前的钱,设置一段动画让钱不够时会闪烁,选择菜单栏上的windows->animation->create->选择保存到Animations文件夹(文件夹自己定义),点击红点开始录制,然后按照喜好变化就好。双击动画进入编辑界面:


    再fuhuaqi上添加脚本buildguanliqi,将定义好的文本和动画赋值上去

    8.创建炮塔,首先选中右侧建造的炮塔,检查mapcube上是否为空,并且鼠标点击mapcube,即可建造。加上粒子效果,建造后money减少。

    9.创建子弹,在头部定义子弹的位置实例化子弹,然后给炮塔加一个Shpere collider用来检测进入的敌人并用数组存放,并且默认攻击第一个,超出范围或者敌人死亡移除该物体在数组中的位置

    10.升级炮塔,检测mapcube上是否有物体存在,物体是否升级过,钱是否够,满足条件这摧毁先前物体,新建升级物体并播放特效。

    11.敌人全部死亡,显示胜利,到达终点则显示失败;

    展开全文
  • 还有就是,此专栏已经开通收费,里面整合的都是小游戏的开发教程,想要学习Unity开发游戏的,都可以订阅一下。 如果文章出现什么问题,就及时联系我 二、效果图&下载链接 Github地址: 三、教程 在教程开始之前...

    推荐阅读

    一、前言

    最近跑酷游戏比较流行,开发教程也很多,但是大部分都是不太详细,这篇文章就带着大家一步一步开发出来一个跑酷类的游戏,教程比较基础,适合大部分Unity开发的初学者。
    还有就是,此专栏已经开通收费,里面整合的都是小游戏的开发教程,想要学习Unity开发游戏的,都可以订阅一下。
    如果文章出现什么问题,就及时联系我

    效果图
    在这里插入图片描述

    二、下载链接

    源工程:
    https://gitee.com/itMonon/Game_Parkour
    模型资源:
    https://gitee.com/itMonon/Unity-plugin/tree/master/Menu/Unity3D-ParkourDemoAssets

    三、教程

    在教程开始之前,我们分析一下跑酷类游戏制作思路。
    首先是道路和障碍物,我们可以先设置三段道路,然后障碍物随机生成
    道路中间有抵达点,角色到达抵达点判断是否将后面的道路移动到前面接起来。
    首先到达第一段的抵达点,肯定是不切换
    到达第二段的抵达点,将1号路段移动到最前面
    到达第三段的抵达点,将2号路段移动到最前面
    循环往复,无穷尽也
    然后是主角的移动脚本,躲避障碍物,移动位置固定三个点,可以跳,可以铲地
    主角碰到障碍物就挂,游戏结束

    1、新建项目

    博主的Unity版本是Unity5.6.1f1,推荐大家使用我这个版本,或者其他的5.6.x版本,不然可能会出现各种各样奇奇怪怪的问题。
    在这里插入图片描述
    文件目录的话就按照我这个目录来,比较清晰明了。

    2、导入资源

    资源已经上传到Github,需要的可以下载

    https://github.com/764424567/Unity-plugin/tree/master/Menu/Unity3D-ParkourDemoAssets
    在这里插入图片描述
    在这里插入图片描述

    3、处理动画资源

    在这里插入图片描述
    可以看到所有的动画文件都有。
    接着我们就可以新建一个Animator Controller文件来管理动画文件。
    在这里插入图片描述
    命名随意。
    在这里插入图片描述
    接着我们将动画剪辑拖到Animator处理面板中:
    在这里插入图片描述
    默认状态是run,然后有jump 、slide、idle
    在这里插入图片描述
    接着就是“Take Transition”将run和jump 以及 run 、slide、idle连下线。

    设置两个bool值,来控制动画的切换:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    接下来我们就可以在场景中看一下动画效果了:
    在这里插入图片描述

    4、处理路段模型

    在这里插入图片描述
    首先我们找到导入的资源SimpleRoadwork,里面有一个Demo场景,点进去可以看一下各类模型:
    在这里插入图片描述
    在Prefabs文件夹中,可以找到我们需要的各类模型,包括路面、路标、障碍物:
    在这里插入图片描述
    接下来,我们就设计一下路面:
    在这里插入图片描述
    在这里插入图片描述
    接着摆放路标:
    在这里插入图片描述
    接着摆放障碍物:
    在这里插入图片描述
    因为障碍物我们要后期自动生成,现在就可以先隐藏起来。
    在这里插入图片描述
    然后设置到达点(到达点的目的是当角色到达这个位置的时候,自动切换路线):
    在这里插入图片描述
    隐藏它的Mesh Renderer ,将BoxCollider IsTrigger设置成true:
    在这里插入图片描述
    路段就完成了:

    在这里插入图片描述
    整个目录如下:
    在这里插入图片描述
    不会摆放也没有关系,我已经设置好了,用我的也行。

    5、主角模型处理

    在这里插入图片描述

    明显是有点大,我们给它同比例缩小一下:
    在这里插入图片描述
    在这里插入图片描述
    接着设置一下摄像机的视角:

    在这里插入图片描述
    在这里插入图片描述

    6、生成障碍物

    新建脚本Control_Scenes.cs
    我们首先来生成障碍物:

    using UnityEngine;
    
    public class Control_Scenes : MonoBehaviour
    {
        public GameObject[] m_ObstacleArray;
        public Transform[] m_ObstaclePosArray;
    
        void Start()
        {
            Spawn_Obstacle(1);
        }
    	
    	//生成障碍物
    	public void Spawn_Obstacle(int index)
        {
            //销毁原来的对象
            GameObject[] obsPast = GameObject.FindGameObjectsWithTag("Obstacle" + index);
            for (int i = 0; i < obsPast.Length; i++)
            {
                Destroy(obsPast[i]);
            }
            //生成障碍物
            foreach (Transform item in m_ObstaclePosArray[index])
            {
                GameObject prefab = m_ObstacleArray[Random.Range(0, m_ObstacleArray.Length)];
                Vector3 eulerAngle = new Vector3(0, Random.Range(0, 360), 0);
                GameObject obj = Instantiate(prefab, item.position, Quaternion.Euler(eulerAngle));
                obj.tag = "Obstacle" + index;
            }
        }
    }
    
    

    将脚本挂在Control_Scenes对象上:
    将Prefab文件夹里面的模型拖入到ObstacleArray对象数组卡槽中
    将隐藏以后的障碍物拖入到ObstaclePosArray对象数组卡槽中
    在这里插入图片描述
    添加Tag:
    在这里插入图片描述
    运行看一下:
    在这里插入图片描述

    7、路段切换

    我们接着打开Control_Scenes.cs
    添加函数:

    void Start()
    {
            //Spawn_Obstacle(1);
            Change_Road(1);
    }
    public void Change_Road(int index)
    {
            if (m_ISFirst && index == 0)
            {
                m_ISFirst = false;
                return;
            }
            else
            {
                int lastIndex = index - 1;
                if (lastIndex < 0)
                    lastIndex = 2;
                m_RoadArray[lastIndex].transform.position = m_RoadArray[lastIndex].transform.position - new Vector3(150, 0, 0);
                Spawn_Obstacle(lastIndex);
            }
    }
    

    PS:这里解释一下代码,怎么切换的呢
    举个例子,角色跑到了第二段,那么第一段要移动到第三段后面隔一个路段长度的距离,接下来画个图:
    在这里插入图片描述
    那么为啥x轴减去150。这是因为我发现这三条路段的距离都差了50,坐标轴是负轴,所以就减去了150。
    在这里插入图片描述

    我们可以测试一下效果:
    在这里插入图片描述
    但是仅仅这样是不够的,我们还需要在角色到达抵达点的时候,切换路线,当然第一段路不用切换,因为再切就没了。。
    这个在我们写完角色移动以后再补充。

    8、角色移动

    新建脚本:Control_Player.cs
    说明一下:因为我们设定的三条道,所以角色只能在三条道里面切换。那么只需要改变角色的z值就可以了。如果角色在最左边,那么只能往右移动,同理在最右边,只能往左移动,在中间两边都可以移动。

    接着我们就可以看一下z轴的值:
    中间:
    在这里插入图片描述
    在这里插入图片描述

    左边:
    在这里插入图片描述
    在这里插入图片描述
    右边:
    在这里插入图片描述
    在这里插入图片描述
    代码:

    using UnityEngine;
    
    public class Control_Player : MonoBehaviour
    {
        //前进速度
        public float m_ForwardSpeeed = 7.0f;
        //动画组件
        private Animator m_Anim;
        //动画现在状态
        private AnimatorStateInfo m_CurrentBaseState;
    
        //动画状态参照
        static int m_jumpState = Animator.StringToHash("Base Layer.jump");
        static int m_slideState = Animator.StringToHash("Base Layer.slide");
    
        // Use this for initialization
        void Start()
        {
            m_Anim = GetComponent<Animator>();
        }
    
        // Update is called once per frame
        void Update()
        {
            transform.position += Vector3.left * m_ForwardSpeeed * Time.deltaTime;
            m_CurrentBaseState = m_Anim.GetCurrentAnimatorStateInfo(0);
            if (Input.GetKeyDown(KeyCode.W))
            {
                m_Anim.SetBool("jump", true);
            }
            else if (Input.GetKeyDown(KeyCode.S))
            {
                m_Anim.SetBool("slide", true);
            }
            else if (Input.GetKeyDown(KeyCode.A))
            {
                Change_PlayerZ(true);
            }
            else if (Input.GetKeyDown(KeyCode.D))
            {
                Change_PlayerZ(false);
            }
            if (m_CurrentBaseState.fullPathHash == m_jumpState)
            {
                m_Anim.SetBool("jump", false);
            }
            else if (m_CurrentBaseState.fullPathHash == m_slideState)
            {
                m_Anim.SetBool("slide", false);
            }
        }
    
        public void Change_PlayerZ(bool IsAD)
        {
            if (IsAD)
            {
                if (transform.position.z == -14.7f)
                    return;
                else if (transform.position.z == -9.69f)
                {
                    transform.position = new Vector3(transform.position.x, transform.position.y, -14.7f);
                }
                else
                {
                    transform.position = new Vector3(transform.position.x, transform.position.y, -9.69f);
                }
            }
            else
            {
                if (transform.position.z == -6.2f)
                    return;
                else if (transform.position.z == -9.69f)
                {
                    transform.position = new Vector3(transform.position.x, transform.position.y, -6.2f);
                }
                else
                {
                    transform.position = new Vector3(transform.position.x, transform.position.y, -9.69f);
                }
    
            }
        }
    }
    
    

    键盘WSAD控制上跳,下滑,左右移动等操作。现在就可以去试试啦。
    在这里插入图片描述

    但是,有一点哈,角色怎么越跑越远离开了我们呢,因为,还没有写摄像机跟随脚本,接下来继续吧。

    9、摄像机跟随

    新建脚本Control_Camera.cs

    using UnityEngine;
    
    public class Control_Camera : MonoBehaviour
    {
    	//间隔距离
    	public float m_DistanceAway = 5f;
    	//间隔高度
    	public float m_DistanceHeight = 10f;
    	//平滑值
    	public float smooth = 2f;               
    	//目标点
    	private Vector3 m_TargetPosition;      
    	//参照点
    	Transform m_Follow;        
    
    	void Start()
    	{
    		m_Follow = GameObject.Find("Player").transform;
    	}
    
    	void LateUpdate()
    	{
    		m_TargetPosition = m_Follow.position + Vector3.up * m_DistanceHeight - m_Follow.forward * m_DistanceAway;
    		transform.position = Vector3.Lerp(transform.position, m_TargetPosition, Time.deltaTime * smooth);
    	}
    }
    
    

    OK 摄像机跟着Player跑起来了

    10、碰撞检测

    我们需要不停的躲避障碍物,一旦碰撞到障碍物就dead了
    我们首先修改障碍物的碰撞器属性:
    在这里插入图片描述
    Mesh Collider : Is Trigger=true
    在这里插入图片描述
    我们给Player加上刚体和碰撞体:
    在这里插入图片描述
    注意要勾上Is Trigger

    打开Control_Player.cs脚本:

    //游戏结束
    bool m_IsEnd = false;
    void OnGUI()
    {
            if (m_IsEnd)
            {
                GUIStyle style = new GUIStyle();
                style.alignment = TextAnchor.MiddleCenter;
                style.fontSize = 40;
                style.normal.textColor = Color.red;
                GUI.Label(new Rect(Screen.width / 2 - 100, Screen.height / 2 - 50, 200, 100), "你输了~", style);
            }
    }
    void OnTriggerEnter(Collider other)
        {
            if (other.gameObject.name == "Vehicle_DumpTruck" || other.gameObject.name == "Vehicle_MixerTruck")
            {
                m_IsEnd = true;
                m_ForwardSpeeed = 0;
                m_Anim.SetBool("idle", true);
            }
        }
    

    11、切换道路

    在第七章的时候就已经写好了道路切换,但是一直没有讲到碰撞检测,那么现在我们就结合碰撞检测,检测到抵达点然后切换道路吧

    我们首先找到三个抵达点:MonitorPos
    然后改名叫做MonitorPos0 MonitorPos1 MonitorPos2
    在这里插入图片描述
    修改一下BoxCollider的Is Trigger属性:
    在这里插入图片描述
    修改Control_Player.cs的代码:

     //场景控制对象
    Control_Scenes m_ControlScenes;
    void Start()
    {
            m_Anim = GetComponent<Animator>();
            m_ControlScenes = GameObject.Find("Control_Scenes").GetComponent<Control_Scenes>();
    }
    void OnTriggerEnter(Collider other)
    {
            if (other.gameObject.name == "Vehicle_DumpTruck" || other.gameObject.name == "Vehicle_MixerTruck")
            {
                m_IsEnd = true;
                m_ForwardSpeeed = 0;
                m_Anim.SetBool("idle", true);
            }
            if (other.gameObject.name == "MonitorPos0")
            {
                m_ControlScenes.Change_Road(0);
            }
            else if (other.gameObject.name == "MonitorPos1")
            {
                m_ControlScenes.Change_Road(1);
            }
            else if (other.gameObject.name == "MonitorPos2")
            {
                m_ControlScenes.Change_Road(2);
            }
    }
    
    展开全文
  • Unity3D开发小游戏】《战棋小游戏》Unity开发教程

    万次阅读 多人点赞 2019-03-15 10:17:37
    这次想要做的一个小游戏,或者说一个小Demo,其实是一个简单且传统的战棋战斗场景。初步的设计是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方依据体力在地图上轮流行动并向对方发动攻击,先消灭掉所有...
  • Unity3D开发小游戏】《超级马里奥》游戏教程 2019年09月12日 16:21:15恬静的小魔龙阅读数 363文章标签:UnityUnity3d开发小游戏更多 分类专栏:Unity3D日常Unity3d手游开发Unity3D开发小游戏 版权声明:本文为...
  • 游戏会为玩家呈现一个“故事卡”。故事卡上包含一些文字,其中一部分是用于描述玩家当前的状态,另外一部分是在当前情况下玩家可以做出的一系列选择。 根据玩家的不同选择,剧情也会按照不同的分支向前发展,并持续...
  • 5款Unity3D制作的小游戏实例,新手必备
  • 一款unity3d做得小游戏

    2018-10-17 16:29:57
    unity3d做的射击游戏,自动刷洗机器人,计分板等,可以无时间限制
  • unity3D小游戏

    2018-06-01 14:27:16
    此为用unity3D编写的小游戏,本压缩文件主要包括4个文件: num1:为一个弹力小球 num2: 创建一个游戏环境(建模) num3: 小球吃金币3D num4:贪吃蛇 此主要用于unity3D练习
  • unity3d小游戏源码

    热门讨论 2013-02-27 17:42:47
    一款用unity3d编写的andriod小游戏的源码,希望可以给大家可以提供参考
  • unity3d小游戏工程目录

    2018-06-23 16:02:25
    自己按教程打出来的用unity3d开发的一个flappybird小游戏,2D的,当时学C#时的大作业
  • Unity3D项目小游戏(3D坦克大战),一个Unity3D小游戏
  • Unity3D 赛车游戏完整源码 GI Racing 2 http://www.idoubi.net/unity3d/complete-project/3570.html Unity3D 街机几何跳跃 完整游戏源码 Geometry Jump http://www.idoubi.net/unity3d/complete-project/3561.html ...
  • Create菜单下 3D Object菜单下Cube 1.1设置属性x100 z100作为地面  1.2在创建一个立方体物体 1.3 Create菜单下 3D Object菜单下Cube    1.4复制立方体 创建一个空物体放立方体        ...
  • Unity如何开发微信小游戏

    千次阅读 2019-08-01 20:12:41
    很多开发Unity的同学, 都想自己开发微信小游戏,无奈tiny还不成熟,导致很多同学有自己创业做微信小游戏的想法,但是由于技术,却放弃了这样的机会,今天我给大家讲述unity同学如何转型做微信小游戏。 1: 解放思想...
  • 一、前言 最初的《打砖块》是在...下面是游戏的预览: 二、版本 项目的版本为:Unity 2018.3.14f1 更新的版本也可以很好的使用了,如果使用旧版本的话可能出现一些API无法使用的错误,为了获得更好的结果,请也使...
  • Unity3d制作简单拼图游戏源码+工程

    千次下载 热门讨论 2012-08-25 21:25:24
    Unity3d制作的简单拼图游戏 制作流程可以看我的博客:http://blog.csdn.net/cube454517408/article/details/7907247
  • 一个unity迷宫小游戏

    2018-05-10 12:04:51
    unity 迷宫游戏 有倒计时,主角是螃蟹,可以发射子弹打敌人,一开始是GUI界面选择关卡。
  • Unity3D基础34:打砖块小游戏设计

    千次阅读 2019-02-06 19:48:21
    这里实现一个简单的“打砖块”小游戏,效果如下: 一、地面和墙壁 第一步:先创建一个"plane"平面和一个"Cube"方块如下,其中Cube添加物理组件,并存储预制体 材质球什么的就不用说了,...
  • unity3D制作拼图游戏

    千次阅读 2019-10-24 15:56:00
    新建项目,添加 UI 中的 canvas 对象 , 在 canvas 对象下创建一个空游戏对象GameObject ,更名为 Grid . 为 Grid添加Gridlayout Group 组件,设置属性如下: Cell Size:Vector2类型,默认值为(100,100),网格中的...
  • Unity小游戏算法分析与实现》 《Unity小游戏算法分析与实现》 版本 作者 参与者 完成日期 备注 Unity2017_GameDemo_V01_1.0 严...
  • UNITY新手小游戏

    千次阅读 2017-03-13 20:40:41
    抢滩登陆简单版一、 制作炮筒,并编写炮筒的旋转脚本在Hierarchy面板创建一个新的空物体,然后在新的空的物体下创建一个Cylinder,并且把Cylinder的位置的Y轴设为1。 在空物体下添加脚本PlayerControlvoid Update ...
  • 嘿嘿,文档是在Word里写的,为了保证格式不改变,就截图了,话说图也很清晰的,哈哈。
  • unity3D游戏开发十二之疯狂的小球

    万次阅读 2014-04-12 03:27:39
    下面我们通过一个具体的实例来了解如何使用物理引擎,该实例通过第三人称视角控制游戏中的小球对象,游戏通过是否与钻石碰撞来界定是否寻找到钻石并获得积分,获得积分满10分后,赢得游戏,当小球冲出跑道时,游戏...
  • Unity3D制作3维立体小游戏

    千次阅读 2017-12-26 21:06:50
    Unity3D报告,纯属个人兴趣
  • unity3d游戏开发实例教程 附带源码(工程文件)
  • 让我们使用Unity3D开发一个打地鼠游戏吧。 打地鼠游戏是一个非常有趣的街机游戏,是在1976年左右发明的。 游戏的主要玩法就是打击从洞里出来的鼹鼠,玩家击中鼹鼠的速度越快,得分就越高 我们将讲解制作游戏的所需的...
  • Unity3D游戏框架设计

    万次阅读 2018-07-03 20:00:09
    Unity框架设计将Unity Api、.NetFramework Api(4.6)以及部分原生库和托管库封装到一个抽象层,游戏本身的业务仅依赖于该抽象层从而提高业务逻辑的独立性和可维护性。 框架部分提供项目中使用的基础设施,包括资源...
  • unity3D简单的汽车游戏

    千次阅读 2012-04-03 21:13:48
    unity3d做的一个简单的汽车游戏,对汽车属性的一些调节我现在还没搞明白了,所以就只做一个简单的demo了,呵呵~~~~我们老师说做游戏一定要会抠图,的确如此,由于我工程中导入的模型多了,文件过大,我没把工程传...

空空如也

1 2 3 4 5 ... 20
收藏数 38,836
精华内容 15,534
关键字:

unity3d小游戏