Unity编写冰球对战游戏 2D版
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 initializationvoid Start () {rig = GetComponent<Rigidbody2D>();}// Update is called once per framevoid 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);right.size = new Vector3(1, tempPosition.y * 2, 1);}
算法较简单,我在这里也不过多赘述了。
当各种基础条件都搭建好后,就可以对操作冰球的脚本文件进行编写了,在之前取消了中了的选项,但是,因为要做出碰撞的效果,所以这里还要添加一个弹力的材质。
在编写小球脚本时需要注意几个问题,怎样让小球一直保持一定速度。游戏开始时小球应该怎样移动。具体实现代码如下:
Rigidbody2D rig;public GameObject gameStart;// Use this for initializationvoid Start(){//GameStart();}public void GameStart(){gameStart.SetActive(false);rig = GetComponent<Rigidbody2D>();int num = Random.Range(0, 2);//获取随机数0或者1if (num == 0){rig.AddForce(new Vector3(-300, 0, 0));}else{rig.AddForce(new Vector3(300, 0, 0));}}// Update is called once per framevoid 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版相关推荐
- 控制台文字对战游戏 初始版
namespace 对战游戏 { class Program { #region public struct JueSe //创建一个角色对象 ...
- unity实现网络对战游戏
1.课设作品需求分析.. 1 2.课设作品详细设计.. 1 3.课设作品编程实现.. 1 3.1场景搭建... 1 3.2角色控制... 1 3.3游戏UI设计... 1 3.4添加声音... 1 3 ...
- 【使用Unity开发Windows Phone上的2D游戏】(1)千里之行始于足下
写在前面的 其实这个名字起得不太欠当,Unity本身是很强大的工具,可以部署到很多个平台,而不仅仅是可以开发Windows Phone上的游戏. 只不过本人是Windows Phone 应用开发出身, ...
- Python编写人机对战小游戏(抓狐狸)(2)
封面图片:<中学生可以这样学Python>,董付国.应根球著,清华大学出版社 =========== 很久很久以前,在公众号里推送过一个抓狐狸游戏,详见Python编写人机对战小游戏(抓小 ...
- unity编写一个简单的小游戏
unity编写一个简单的小游戏 简易fly bird的制作 关于flybird 场景的搭建和素材的导入 使用素材搭建game和scene 制作柱体 bird的script column的sprite ...
- unity3d游戏2d横版射击游戏完整项目源码分享
unity3d游戏2d横版射击游戏完整项目源码分享 免费下载地址: 链接:https://pan.baidu.com/s/1YwhEy7DeKIHFU8pBLdJFPg 提取码:3wnx 复制这段内容 ...
- 你们要的Unity联网对战游戏小Demo
前言 开发3D游戏听起来门槛很高,但是Unity的出现让门槛大大降低.开发联网实时对战的3D游戏门槛就更高,因为即便熟悉掌握了Unity的开发技术,联网的游戏还要涉及到熟悉网络协议栈.掌握后端知识以及 ...
- Unity联网对战游戏小Demo
前言 开发3D游戏听起来门槛很高,但是Unity的出现让门槛大大降低.开发联网实时对战的3D游戏门槛就更高,因为即便熟悉掌握了Unity的开发技术,联网的游戏还要涉及到熟悉网络协议栈.掌握后端知识以及 ...
- Unity安卓游戏开发:打造7款2D 3D游戏 Unity Android Game Development : Build 7 2D 3D Games
流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确) |大小:15.4 GB |时长:32h 55m Un ...
最新文章
- html5类选择器选择权重,Python Html5和CSS3的新增功能:CSS权重与CSS3新增选择器
- wikioi 3027 线段覆盖 2
- git 放弃本地修改,强制拉取更新
- 腾腾流氓,云云更流氓(问微信怎样接入支付宝支付),手贱的赶紧点,你会感谢我的...
- javascript 图表_JavaScript 2018年的三个有争议的图表
- 存储ic载板_延伸IC领域 崇达技术拟将持有普诺威55%股权
- [理解] Linux 作为一个服务器是怎样的存在 (一)
- js原生attachEvent与addEventListener的用法
- php 多任务,PHP并行多任务研究(笔记)
- QT 和Ogre Demo
- js find(),findIndex()方法的使用
- python怎么写excel数据透视自动报表_使用Python生成自动报表(E
- matlab坐标旋转平移缩放,MATLAB实现RGB图像的平移、缩放和旋转
- 线程池作用及C语言实现
- 伦敦同业拆借利率(LIBOR)
- 公司服务器文件拷贝痕迹,服务器文件拷贝监控
- 125款程序员专属情人节表白网站【建议收藏】HTML+CSS+JavaScript
- 案例 02、OpenGL入门--正方形键位控制
- 马云《功守道》完整版 网友:天下武功 唯钱不破
- 该怎么用好EDIUS中的调音台
热门文章
- 利用PR将视频保存成一系列图片
- 马尔科夫不等式和坎泰利不等式的证明
- 桌面上 计算机 图标打不开,突然间电脑桌面上的所有图标都打不开了,怎么回事,求大神讲解...
- oracle存储过程初学实例
- widget jquery 理解
- hdu4416 Good Article Good sentence(多个串的本质不同的串个数,后缀自动机)
- 微信小程序海报生成图片合成工具类
- 工控网关linux用什么芯片,重庆工控嵌入式主板原理,工业网关怎么挑
- 关于学术文献推荐系统的调研报告
- 2022-2027年中国安防智能化行业市场全景评估及发展战略规划报告