Unity编写冰球对战游戏 2D版
2017-09-25 19:35
393 查看
Unity编写冰球对战游戏 2D版
Unity是一款非常方便、简洁、低成本的一款游戏引擎。在这里,向大家介绍这样用Unity这个引擎编写冰球对战游戏因为Unity这个引擎可以编写3D游戏 ,同样的也可以编写2D游戏,这里先给大家介绍2D版的编写过程
首先,先创建项目,创建项目的具体过程在上一篇文章中有详细介绍,这里就不多赘述了。
这里可以看到,选择2D版与3D版的编写界面有些不同,摄像机是一个平面视角,而Game视窗显示出二维的游戏场景。
而在2D版的编写中,大多用到Sprite(精灵)组件来构成场景、添加主角人物等等等等。可以说,Sprite在2D游戏开发中相当于基石或者祖师爷的存在。
在进行总体的编写之前,对冰球对战这个游戏进行简单的需求分析
1. 游戏基本要素: 需要游戏背景、游戏中的冰球所对应的圆形、游戏中由玩家控制的长方形反弹壁、限制冰球活动和反弹壁活动的虚拟墙壁。
2. 游戏规则: 游戏开始时小球在随机方向上进行移动,玩家控制反弹壁将小球反弹到对方区域,碰到上、下两侧墙壁时,小球按照相应角度进行反弹。当遇到反弹壁后的墙壁时,游戏结束,对方积分加一。
3. 特殊要求: 对虚拟的碰撞墙壁可进行自适应操作(即可以在分辨率改变的情况下,虚拟墙壁的位置,大小也可以发生改变)。
4. UI:计分板,每次得出胜负后,计分板会出现相应的变化。
对冰球对战这个游戏进行简单的需求分析后开始进行项目的编写。
由上图可以看到,最开始时是一个空的场景,里面的任何东西都需要我们自己去添加。在Hierarchy中右键添加Sprite来创建游戏背景,游戏反弹壁和游戏球(这里要注意,Sprite的外观颜色是不能单独更改的,必须要通过添加材质的方式来对Sprite的外观等进行修改)。并在Project下添加已制作好的Sprite的材质。创建后的界面效果如下:
向Sprite中添加材质的方法: 点击要添加材质的Sprite,这时属性栏会出现这个Sprite的各项参数,将所确定的材质拖入到众多属性中的Sprite中即可。
创建完基本元素后,接下来要编写脚本实现对2个反弹壁的控制,在Project的Script中创建一个C#脚本文件,文件名随意。
在上图的左边显示的是你所创建的脚本的代码内容,当然,现在只包含最基本的主函数,头文件等等,要让反弹壁进行移动还要自己添加代码。双击这个脚本文件,这是系统会启动VS,在VS下进行编写
编写脚本前,要记得对这两个反弹壁添加Rigidbody2D,并取消掉重力这个选项。这样才可以进行一下操作。
因为是控制反弹壁的移动,所以要设置键位,当按下键位是,采取相应的操作,具体代码如下:
public class PlayerController : MonoBehaviour { public KeyCode up; public KeyCode down; Rigidbody2D rig; public float speed = 5; // Use this for initialization void Start () { rig = GetComponent<Rigidbody2D>(); } // Update is called once per frame void Update () { if (Input.GetKey(up)) { rig.velocity = new Vector3(0,speed,0); } else if(Input.GetKey(down)) { rig.velocity = new Vector3(0, -speed, 0); } else { rig.velocity = new Vector3(0, 0, 0); } } }
编写好脚本后,拖到反弹壁的两个Sprite中,并在属性中设置相应的键位(想要在属性中设置各个变量的参数,需要将该变量Public化)。
经过以上操作后以及实现反弹壁的上下移动,但在这里会出现一个bug,就是反弹壁的移动是没有限制的,所以接下来我们要创建4个虚拟墙壁,用GameManager来实现。创建4个GameManager,添加到一个Game Manager中,并赋予不同的名称。
根据之前的需求说明可以知道,要实现这个虚拟墙壁GameManager的自适应化,就要使用代码来获取当前分辨率的各种参数,并按照参数进行调整并赋值到GameManager的各个属性中。
具体代码如下:
BoxCollider2D left; BoxCollider2D top; BoxCollider2D right; BoxCollider2D down; private void RestWall() { left = transform.Find("left").GetComponent<BoxCollider2D>(); top = transform.Find("top").GetComponent<BoxCollider2D>(); right = transform.Find("right").GetComponent<BoxCollider2D>(); down = transform.Find("down").GetComponent<BoxCollider2D>(); Vector3 tempPosition = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height)); top.transform.position = new Vector3(0, tempPosition.y + 0.5f, 0); left.transform.position = new Vector3(-tempPosition.x - 0.5f, 0, 0); right.transform.position = new Vector3(tempPosition.x + 0.5f, 0, 0); down.transform.position = new Vector3(0, -tempPosition.y - 0.5f, 0); top.size = new Vector3(tempPosition.x*2,1,1); down.size = new Vector3(tempPosition.x * 2, 1, 1); left.size = new Vector3(1, tempPosition.y * 2, 1); add3 right.size = new Vector3(1, tempPosition.y * 2, 1); }
算法较简单,我在这里也不过多赘述了。
当各种基础条件都搭建好后,就可以对操作冰球的脚本文件进行编写了,在之前取消了中了的选项,但是,因为要做出碰撞的效果,所以这里还要添加一个弹力的材质。
在编写小球脚本时需要注意几个问题,怎样让小球一直保持一定速度。游戏开始时小球应该怎样移动。具体实现代码如下:
Rigidbody2D rig; public GameObject gameStart; // Use this for initialization void Start() { //GameStart(); } public void GameStart() { gameStart.SetActive(false); rig = GetComponent<Rigidbody2D>(); int num = Random.Range(0, 2);//获取随机数0或者1 if (num == 0) { rig.AddForce(new Vector3(-300, 0, 0)); } else { rig.AddForce(new Vector3(300, 0, 0)); } } // Update is called once per frame void Update() { if (rig) { //解决小球速度越来越慢 Vector3 velocity2 = rig.velocity; //print(velocity2); if (Mathf.Abs(velocity2.x) < 9 && velocity2.x != 0) { if (velocity2.x > 0) { velocity2.x = 10; } else { velocity2.x = -10; } rig.velocity = velocity2; } } } void OnCollisionEnter2D(Collision2D collision) { Vector3 velocity1 = rig.velocity; if (collision.gameObject.tag == "Player") { velocity1.y = velocity1.y / 2 + collision.rigidbody.velocity.y / 2; } if (collision.gameObject.tag == "Left") { print("ss"); GameManager.instance.ScoreChanged("left"); } if (collision.gameObject.tag == "Right") { print("ss"); GameManager.instance.ScoreChanged("right"); } rig.velocity = velocity1; }
这样一个冰球对战的Unity2D版就已经完成了,如果想加入UI的话,与添加Sprite的方法相同,并在GameManger的脚本中对UI积分板的变化进行代码编写,具体代码如下:
int score1 = 0; int score2 = 0; public Text txtScore1; public Text txtScore2; public void ScoreChanged(string wallName) { print("aa"); if (wallName=="left") { score2++; } if (wallName=="right") { score1++; } txtScore1.text = score1.ToString(); txtScore2.text = score2.ToString(); }
相关文章推荐
- unity 2D游戏开发 制作帧动画的两种方法
- Unity开发2D游戏之游戏背景的移动
- Unity网络教程翻译(一)从零开始编写一个网络游戏
- 【Unity&2D】使用Unity制作2D像素游戏用到的使用插件
- Unity游戏引擎挖坑记之3d游戏2d显示管理(血条、飘血)(一)
- 学习手机游戏开发的两个方向 Cocos2d-x 和 Unity 3D/2D,哪个前景更好?
- unity 2D跳跃游戏截图
- UNITY 2D学习笔记(二):C#脚本编写
- Unity4.x 2D游戏开发基础教程第1章Unity及其组成的介绍
- Unity - 2D游戏中掉帧严重问题解决
- unity初识之2d游戏中做碰撞检测
- Unity_2D游戏工程的创建_071
- Unity 4.x 2D游戏开发基础教程
- android 2D游戏开发,引擎设计(三) 实验脚本编写与纸娃娃系统
- Unity 2D游戏开发教程之摄像头追踪功能
- Unity 2D游戏开发教程之游戏精灵的开火状态
- Unity2D游戏开发基础教程1.2项目、资源和场景
- 使用Unity编写传统ARPG游戏人物操作方式(二)
- Unity游戏的局域网对战功能实现
- 强大的游戏开发工具Unity3D推出2D开发工具,unity将混合3D与2D开发