Unity 游戏实例开发集合 之 打砖块 休闲小游戏快速实现

Unity 游戏实例开发集合 之 打砖块 休闲小游戏快速实现

目录

Unity 游戏实例开发集合 之 打砖块 休闲小游戏快速实现

一、简单介绍

二、打砖块游戏内容与操作

三、游戏代码框架

四、知识点

五、游戏效果预览

六、实现步骤

七、工程源码地址

八、延伸扩展


一、简单介绍

Unity 游戏实例开发集合,使用简单易懂的方式,讲解常见游戏的开发实现过程,方便后期类似游戏开发的借鉴和复用。本节介绍,打砖块 休闲小游戏快速实现的方法,希望能帮到你,若有不对,请留言。

二、打砖块游戏内容与操作

1、游戏开,砖块自动堆积生成

2、鼠标位置即是射击方向

3、鼠标点击左键发射球体

4、点击 Space 空格键,重新开始游戏

三、游戏代码框架

四、知识点

1、MonoBehaviour 生命周期函数:Awake,Start,Update,OnGUI

2、Input 按键的监控

3、GameObject.Instantiate 物体的生成,GameObject.Destroy 物体的销毁

4、Camera.WorldToScreenPoint 世界坐标转屏幕坐标,Camera.ScreenToWorldPoint 屏幕坐标转世界坐标

5、Rigidbody 、GetComponent<Rigidbody>().velocity 物体物理效果、物理运动

6、GUIStyle GUI样式,GUI.Label 添加文字的功能使用

7、等等

附录:Unity API 中详细介绍了unity脚本默认函数的执行顺序,点这里访问。这里主要介绍下面这张图:

五、游戏效果预览

六、实现步骤

1、打开 Unity,创建工程,导入相关资源 (相关资源获取可以从后面的工程源码获取)

2、构建场景,主要添加地面 Plane,砖块组 BrickGroup 作为生成的砖块的父物体管理和初始位置,BallGroup 作为生成球体的父物体管理

3、地面 Plane 添加材质 Stylize Tiles Diffuse

4、BrickStartPosition 的砖块初始生成位置设置为 (-5,0.5,0) ,可以根据你的实际视野自行调整

5、预制体 Brick 来源于 block_brick_brown_4_LOD2,添加 Rigidbody 刚体物理效果,和 BoxCollider 碰撞体效果

6、预制体 Brick 来源于 Soccer Ball Mesh,添加 Rigidbody 刚体物理效果,和 SphereCollider 碰撞体效果

7、BrickManager 砖块管理类,主要两个函数控制砖块的生成和销毁

8、BrickManager 砖块管理类,SpawnBricks 用来生成初始的砖块矩阵

参数说明:

        /// <param name="startPost">砖块的起始位置</param>
        /// <param name="col">砖块的列数</param>
        /// <param name="row">砖块的行数</param>
        /// <param name="distance">砖块的间隔距离</param>

        /// <summary>
		/// 生成砖块矩阵
		/// </summary>
		/// <param name="startPost">砖块的起始位置</param>
		/// <param name="col">砖块的列数</param>
		/// <param name="row">砖块的行数</param>
		/// <param name="distance">砖块的间隔距离</param>
		public void SpawnBricks(GameObject brick,Transform parentTra,Vector3 startPost, int col,int row,float distance) {
            if (brick != null )
            {
				
				GameObject go = null;
				// 根据行列生成 砖块
                for (int i = 0; i < col; i++)
                {
                    for (int j = 0; j < row; j++)
                    {
						// 生成砖块,并且设置位置
						go = GameObject.Instantiate(brick, parentTra);
						go.transform.position = new Vector3(startPost.x+ j* distance, startPost.y+ i* distance, startPost.z);
						m_BricksList.Add(go);
					}
                }
            }
		}

9、BrickManager 砖块管理类,DestoryBricks 负责砖块的销毁

		/// <summary>
		/// 销毁砖块
		/// </summary>
		public void DestoryBricks() {
            if (m_BricksList!=null)
            {
				// 依次销毁砖块
                for (int i = m_BricksList.Count-1; i >= 0; i--)
                {
					GameObject.Destroy(m_BricksList[i]);
                }

				m_BricksList.Clear();
            }
		}

10、BrickManager 砖块管理类,主要两个函数控制球体的生成发射和销毁

11、BrickManager 砖块管理类,ShootBall 负责球的生成和发射

参数说明:

        /// <param name="ball">球的预制体</param>
        /// <param name="parentTra">球生成的父物体</param>
        /// <param name="startPost">球生成的初始位置</param>
        /// <param name="forwardDir">球的运动方向</param>
        /// <param name="speed">球的运动速度</param>

		/// <summary>
		/// 生成并发射球体
		/// </summary>
		/// <param name="ball">球的预制体</param>
		/// <param name="parentTra">球生成的父物体</param>
		/// <param name="startPost">球生成的初始位置</param>
		/// <param name="forwardDir">球的运动方向</param>
		/// <param name="speed">球的运动速度</param>
		public void ShootBall(GameObject ball, Transform parentTra, Vector3 startPost,Vector3 forwardDir,float speed) {
            if (ball!=null)
            {
				// 生成球体,设置初始位置,并且添加运动速度
				GameObject go = GameObject.Instantiate(ball, parentTra);
				go.transform.position = startPost;
				go.GetComponent<Rigidbody>().velocity = forwardDir * speed;
				m_BallsList.Add(go);
			}
		}

12、BrickManager 砖块管理类,ShootBall 负责球的销毁

		/// <summary>
		/// 销毁球体
		/// </summary>
		public void DestoryBalls() {
			if (m_BallsList != null)
			{
				// 依次销毁球体
				for (int i = m_BallsList.Count - 1; i >= 0; i--)
				{
					GameObject.Destroy(m_BallsList[i]);
				}

				m_BallsList.Clear();
			}
		}

13、Tools 工具类

14、Tools 工具类,函数 MousePosScreenToWorldPos 主要是把鼠标位置转为对应的世界坐标位置

参数说明:
        /// <param name="refTran">对应参照对象</param>
        /// <param name="refCamera">对应参照相机</param>
        /// <returns>鼠标的世界位置</returns>

        /// <summary>
		/// 把鼠标屏幕坐标转为世界坐标
		/// </summary>
		/// <param name="refTran">对应参照对象</param>
		/// <param name="refCamera">对应参照相机</param>
		/// <returns>鼠标的世界位置</returns>
		public static Vector3 MousePosScreenToWorldPos(Transform refTran,Camera refCamera) {
			//将对象坐标换成屏幕坐标
			Vector3 pos = refCamera.WorldToScreenPoint(refTran.position);
			//让鼠标的屏幕坐标与对象坐标一致
			Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, pos.z);
			//将正确的鼠标屏幕坐标换成世界坐标交给物体
			return refCamera.ScreenToWorldPoint(mousePos);

		}

15、GameStart 游戏开始类

16、GameStart 游戏开始类,Awake 和 Start 实例化一些参数,以及生产砖块矩阵

		private void Awake()
        {
			// 实例化参数
			m_Instance = this;
			m_BrickManager = new BrickManager();
			m_BallManager = new BallManager();
			m_MainCamera = Camera.main;
		}

		// Start is called before the first frame update
		void Start()
		{
			// 生成砖块
			m_BrickManager.SpawnBricks(Brick,BrickParent,BrickStartPosition.position,
				BrickCol,BrickRow,BrickDistance);

		}

17、GameStart 游戏开始类,Update 中监听鼠标按下发射球体,监听 Space 空格键按下重新开始游戏

		// Update is called once per frame
		void Update()
		{
			// 鼠标按下,发射球
            if (Input.GetMouseButtonDown(0))
            {
				// 计算当前鼠标在屏幕的位置,得到球的发射目标方向
				Vector3 forwardDir = (Tools.MousePosScreenToWorldPos(BrickParent,m_MainCamera)-m_MainCamera.transform.position).normalized;
				
				// 生成并发射球体
				m_BallManager.ShootBall(Ball, BallParent,m_MainCamera.transform.position, forwardDir, BallShootSpeed);

			}

			// 按下空格键,重新加载当前游戏
            if (Input.GetKeyDown(KeyCode.Space))
            {
				SceneManager.LoadScene(SceneManager.GetActiveScene().name); 
            }
		}

18、GameStart 游戏开始类,OnDestroy 负责游戏结束后,自动销毁球体和砖块,OnGUI 添加对应的游戏操作说明

		// Unity 周期函数 销毁的时候调用
        private void OnDestroy()
        {
			m_BrickManager.DestoryBricks();
			m_BallManager.DestoryBalls();

		}

		// Unity 周期函数 每帧调用
		private void OnGUI()
        {
			// 游戏操作说明
			GUIStyle fontStyle = new GUIStyle();
			fontStyle.normal.background = null;    //设置背景填充
			fontStyle.normal.textColor = new Color(1, 0, 0);   //设置字体颜色
			fontStyle.fontSize = 40;       //字体大小
			GUI.Label(new Rect(10, 10, 200, 200), 
				"操作说明:\n1、鼠标位置是球发射的目标方向;\n2、点击鼠标左键发射球体;\n3、点击空格键重新开始游戏;", 
				fontStyle);

		}

19、把 GameStart 游戏开始类添加到场景中,并对应赋值

注意:可以自定义设置砖块的 行列数,以及球的 发射速度

20、运行场景,状态自动生成

21、鼠标点击发射球体, Space 空格键重新开始游戏,即可开始玩了

七、工程源码地址

github 地址:GitHub - XANkui/UnityMiniGameParadise: Unity 游戏开发集合代码集

八、延伸扩展

游戏的好不好玩,趣味性,视觉化等诸多因素影响,下面简单介绍几个方面拓展游戏的方向,仅做参考

1、可以根据自己需要动态生成不同的墙或者球体,动态墙生成的过程等

2、可以根据需要添加撞击特效,音效等

3、添加 UI 面板等,美化游戏

4、等等

猜你喜欢

转载自blog.csdn.net/u014361280/article/details/122322636