(结对作业)基于Unity 3D游戏引擎开发的“打砖块”游戏
2014-11-20 23:18
519 查看
游戏简介:游戏在传统的打砖块游戏的基础上增加的3D的效果。游戏的操作非常简单,简单的左右方向键控制,以及鼠标对视角的控制。
编写人员: 朱俊璋,王士溥
开发工具:Unity3D 4.3
开发语言:C#
计划
任务分工:后台的游戏功能的具体实现和测试,后台代码的编写和调试 朱俊璋
游戏前端界面的设计和游戏逻辑功能的创想 王士溥
开发时间:2周
功能简介:3D打砖块小游戏,实现基本功能,在游戏中可以通过鼠标调节camera视角以及位置——左键+移动鼠标-水平移动;右键+移动鼠标-摄像头倾斜角度;滚轮-缩放镜头。运行游戏:
原始视角通过鼠标调节视角
游戏界面的设计:
源代码:
BreakoutGame类:该类是游戏的主功能类,游戏的初始化和游戏界面的渲染都在此类中。该脚本绑定到游戏Main Camera组件中,使游戏在一开始时就调用此脚本。using UnityEngine; using System.Collections; public enum BreakoutGameState { playing, win, lost };//定义游戏状态. public class BreakoutGame : MonoBehaviour { <span style="white-space:pre"> </span>public static BreakoutGame SP; <span style="white-space:pre"> </span>public Transform ballPrefab;//珠球. <span style="white-space:pre"> </span>private int totalBlocks;//总的方块数. private int blocksHit;//已经击打的方块数. <span style="white-space:pre"> </span>private BreakoutGameState gameState;//游戏状态. public float ZoomSpeed = 10; public float MovingSpeed = 0.5f;//移动速度. public float RotateSpeed = 1;//旋转速度. public float distance = 5; <span style="white-space:pre"> </span> void Awake() <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>SP = this; <span style="white-space:pre"> </span>blocksHit = 0; <span style="white-space:pre"> </span>gameState = BreakoutGameState.playing; <span style="white-space:pre"> </span>totalBlocks = GameObject.FindGameObjectsWithTag("Pickup").Length;//得到所有的方块数. <span style="white-space:pre"> </span>Time.timeScale = 1.0f;//设置传递时间为1 . //SpawnBall(); <span style="white-space:pre"> </span>} void Update(){ Quaternion rotation = Quaternion.identity; Vector3 position; float delta_x, delta_y, delta_z; float delta_rotation_x, delta_rotation_y; //按下鼠标左键. if(Input.GetMouseButton(0)){ delta_x = Input.GetAxis("Mouse X") * MovingSpeed;//获取x轴方向的鼠标运动增量,乘以相应的移动速度. delta_y = Input.GetAxis("Mouse Y") * MovingSpeed;//获取y轴方向的鼠标运动增量,乘以相应的移动速度. //rotation = Quaternion.Euler(0,transform.rotation.eulerAngles.y,0);//设置旋转的角度,存储在Quaternion中. rotation.eulerAngles = new Vector3(0,transform.rotation.eulerAngles.y,0); transform.position = rotation * new Vector3(-delta_x,0,-delta_y)+transform.position; //Debug.Log(rotation); } //按下鼠标右键. if(Input.GetMouseButton(1)){ delta_rotation_x = Input.GetAxis("Mouse X") * RotateSpeed; delta_rotation_y = Input.GetAxis("Mouse Y") * RotateSpeed; position = transform.rotation*new Vector3(0,0,distance)+transform.position; transform.Rotate(0,delta_rotation_x,0,Space.World); transform.Rotate(delta_rotation_y,0,0); transform.position = transform.rotation * new Vector3(0,0,-distance)+position; } //滑动鼠标滚动条. if(Input.GetAxis("Mouse ScrollWheel")!=0){ delta_z = -Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed; transform.Translate(0,0,-delta_z); distance += delta_z; } } /// <summary> /// 初始化珠球 /// </summary> <span style="white-space:pre"> </span>void SpawnBall() <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>Instantiate(ballPrefab, new Vector3(1.81f, 1.0f , 9.75f), Quaternion.identity);//实例化珠球. <span style="white-space:pre"> </span>} /// <summary> /// 界面的渲染 /// </summary> <span style="white-space:pre"> </span>void OnGUI(){ <span style="white-space:pre"> </span>GUILayout.Label("作者:朱俊璋、王士溥"); <span style="white-space:pre"> </span>GUILayout.Space(10);//添加空格. <span style="white-space:pre"> </span>GUILayout.Label(" 己击打: " + blocksHit + "/" + totalBlocks); //游戏开始. if (GUI.Button(new Rect(0,150,80,30),"开始游戏")) { SpawnBall(); } <span style="white-space:pre"> </span>if (gameState == BreakoutGameState.lost) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>GUILayout.Label("你输了!"); <span style="white-space:pre"> </span>if (GUILayout.Button("重新加载")) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>Application.LoadLevel(Application.loadedLevel);//重新加载关卡. <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>}else if (gameState == BreakoutGameState.win) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>GUILayout.Label("你赢了!"); <span style="white-space:pre"> </span>if (GUILayout.Button("重新加载")) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>Application.LoadLevel(Application.loadedLevel); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} /// <summary> /// 击打砖块 /// </summary> <span style="white-space:pre"> </span>public void HitBlock() <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>blocksHit++; <span style="white-space:pre"> </span>if (blocksHit%10 == 0) //每击打十个砖块生成新的珠球. <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>SpawnBall(); <span style="white-space:pre"> </span> } <span style="white-space:pre"> </span> if (blocksHit >= totalBlocks)//游戏胜利. <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>WinGame(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} /// <summary> /// 珠球掉落 /// </summary> public void LostBall() { int ballsLeft = GameObject.FindGameObjectsWithTag("Player").Length;//获得剩余珠球数. if(ballsLeft<=1){ SetGameOver();//游戏结束. } } /// <summary> /// 游戏胜利 /// </summary> <span style="white-space:pre"> </span>public void WinGame() <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>Time.timeScale = 0.0f; //设置游戏暂停. <span style="white-space:pre"> </span>gameState = BreakoutGameState.win; <span style="white-space:pre"> </span>} /// <summary> /// 游戏失败 /// </summary> <span style="white-space:pre"> </span>public void SetGameOver() <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>Time.timeScale = 0.0f; //设置游戏暂停. <span style="white-space:pre"> </span>gameState = BreakoutGameState.lost; <span style="white-space:pre"> </span>} }Ball类:该类绑定在BallPre.prefab游戏组件中,用于控制小球的速度。
using UnityEngine; using System.Collections; public class Ball : MonoBehaviour { public float maxVelocity = 20;//珠球最大速度. public float minVelocity = 15;//珠球最小速度. void Awake () { rigidbody.velocity = new Vector3(0, 0, -18);//小球初始速度. } void Update () { //控制小球的速度在15—20之间. float totalVelocity = Vector3.Magnitude(rigidbody.velocity);//得到珠球的总的速度. if(totalVelocity > maxVelocity){ float tooHard = totalVelocity / maxVelocity; rigidbody.velocity /= tooHard; } else if (totalVelocity < minVelocity) { float tooSlowRate = totalVelocity / minVelocity; rigidbody.velocity /= tooSlowRate; } //print(rigidbody.velocity); //若珠球的z坐标小于-3,游戏结束. if(transform.position.z <= -3){ BreakoutGame.SP.LostBall(); Destroy(gameObject);//消除游戏组件. } //print (rigidbody.velocity); } }Paddle类:该脚本绑定到游戏组件paddle中,用于调节控制板条的移动。
using UnityEngine; using System.Collections; public class Paddle : MonoBehaviour { public float moveSpeed = 20; void Update () { //获取水平方向,得到移动距离. float moveInput = Input.GetAxis("Horizontal") * Time.deltaTime * moveSpeed; <span style="white-space:pre"> </span>transform.position += new Vector3(moveInput, 0, 0); //控制板条移动范围. <span style="white-space:pre"> </span>float max = 14.0f; <span style="white-space:pre"> </span>if (transform.position.x <= -max || transform.position.x >= max) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>float xPos = Mathf.Clamp(transform.position.x, -max, max); //板条移动的x坐标范围在-max和max之间. <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>transform.position = new Vector3(xPos, transform.position.y, transform.position.z); <span style="white-space:pre"> </span>} } /// <summary> /// 增加小球碰撞后的水平速度,否则小球左右反弹的效果不理想。当珠球退出碰撞时调用该方法 /// </summary> /// <param name="collisionInfo">Collision info.碰撞事件</param> void OnCollisionExit(Collision collisionInfo ) { Rigidbody rigid = collisionInfo.rigidbody;//得到我们碰撞的刚体. float xDistance = rigid.position.x - transform.position.x;//碰撞的珠球与板条的水平距离,落到板条中间时,水平速度保持不变. rigid.velocity = new Vector3(rigid.velocity.x + xDistance, rigid.velocity.y, rigid.velocity.z);//刚体碰撞后的速度. } }Block类:该脚本绑定到砖块Block中。
using UnityEngine; using System.Collections; public class Block : MonoBehaviour { /// <summary> /// 触发器 /// </summary> void OnCollisionEnter () { BreakoutGame.SP.HitBlock(); Destroy(gameObject);//删除组件 } }
性能分析:
CPU Usage
GPU Usage
Rendering
Memory
Physics
心得体会:
这次的作业与上一次有很大的区别,需要两个人的分工和合作,这次的内容更加贴近我们兴趣和爱好,贴近实际应用,而且使用了当下流行的3d游戏引擎Unity 3D。
相关文章推荐
- 用Unity开发基于Oculus Rift的体验游戏时遇到天空盒重影问题的解决方法
- 关于游戏开发,如何开发一款游戏(基于unity)
- Unity中国技术总监刘钢:如何优化基于Unity开发的3D移动游戏
- 【Unity游戏开发之十一】基于NGUI的表情图文混排解决方案
- Unity开发安卓游戏(2):基于安卓游戏的优化方案总结!
- 今日推荐。基于unity的游戏开发视频,适合自学。
- 《游戏设计、原型与开发——基于Unity与C#从构思到实现》学习笔记一
- Unity开发安卓游戏(2):基于安卓游戏的优化方案总结!
- 基于Unity3D的打砖块游戏开发
- Unity开发基于Android平台的脑波游戏教程
- 基于八叉树空间划分的游戏引擎开发计划
- 基于Nokia S60的游戏开发之四
- 基于J2ME的游戏开发总结和感想 推荐
- 基于Java的移动游戏开发入门-Java基础-Java-编程开发
- 基于Nokia手机的移动游戏开发步步通
- Orz是一个基于Ogre思想的游戏开发架构
- 和微软合作的garagegames公司推出基于XNA的游戏引擎TorqueX,支持快速开发(近期引擎免费提供使用)
- 基于Nokia手机的移动游戏开发步步通
- 基于silverlight GDE-X开发进展 - 游戏引擎状态机
- [转贴]基于Nokia S60的游戏开发之四