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、等等