Unity 学习日记 12.小球撞击冰块游戏

2024-03-29 21:20

本文主要是介绍Unity 学习日记 12.小球撞击冰块游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.准备场景

2.让小球动起来

3.用鼠标把小球甩出去

4.加入鼠标点击小球的判断

5.小球与冰块的碰撞测试

6.撞击后销毁冰块

​编辑

7.显示游戏计时

8.显示扔球次数

9.显示剩余冰块个数

10.游戏结束

11.完整代码


下载源码 UnityPackage

最终效果:


1.准备场景

点击下载素材

步骤 :

  1. 将素材图片统一放进文件夹Materials

  2. 在场景中放置背景图边框图,调整到合适位置

  3. 在场景中放置冰块,调整到合适位置


2.让小球动起来

步骤 :

  1. 创建一个脚本HitIce,并挂载在小球上

  2. 给小球添加Rigibody2D组件

  3. 使用Rigibody2D组件AddForce()方法,编写一段简单脚本

  4. 给小球添加球形碰撞器,给边框加上多边形碰撞器 Polygon Collider 2D

  5. 给冰块预制体,添加盒状碰撞器,调整合适大小

  6. 给冰块预制体,添加Rigibody2D组件,调整重力大小为0

    void Start(){// 让小球向右上方移动this.GetComponent<Rigidbody2D>().AddForce(new Vector2(100, 100));}


3.用鼠标把小球甩出去

修改脚本如下:

 // 记录鼠标按下位置Vector2 startPos;// 记录鼠标松开位置Vector2 endPos;// 记录鼠标方向向量Vector2 force;void Start(){// 让小球向右上方移动//this.GetComponent<Rigidbody2D>().AddForce(new Vector2(100, 100));}void Update(){// 按下鼠标左键if (Input.GetMouseButtonDown(0)){startPos = Input.mousePosition;}if (Input.GetMouseButtonUp(0)){endPos = Input.mousePosition;// 位移方向 = 终点方向 - 起始方向force = endPos - startPos;// 向鼠标位移方向施加力this.GetComponent<Rigidbody2D>().AddForce(force * 2);}}


4.加入鼠标点击小球的判断

实现点:

  1. RaycastHit2D() 的射线检测

  2. 是否点击到小球的bool开关

修改脚本如下:

Vector2 startPos; // 记录鼠标按下位置
Vector2 endPos;   // 记录鼠标松开位置
Vector2 force;    // 记录鼠标方向向量RaycastHit2D hitInfo; // 射线检测到的信息
bool isClick; // 是否点击到小球void Start()
{// 让小球向右上方移动//this.GetComponent<Rigidbody2D>().AddForce(new Vector2(100, 100));
}void Update()
{// 按下鼠标左键if (Input.GetMouseButtonDown(0)){startPos = Input.mousePosition;// 以鼠标点击的位置向鼠标深处发射一条射线hitInfo = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);// 判断射线是否检测到碰撞体if(hitInfo.collider != null){// 判断检测的到物体名称是否与小球相等if(hitInfo.collider.name == this.name){isClick = true;}}}// 松开鼠标左键if (Input.GetMouseButtonUp(0) && isClick){endPos = Input.mousePosition;// 位移方向 = 终点方向 - 起始方向force = endPos - startPos;// 向鼠标位移方向施加力this.GetComponent<Rigidbody2D>().AddForce(force * 2);isClick = false;}
}


5.小球与冰块的碰撞测试

步骤:

  1. 在小球的脚本里,定义一个全局变量Score

  2. 创建一个PengZhuang的脚本,挂载在冰块预制体上

  3. 添加OnCollisionEnter2D()

  4. 跨脚本访问全局变量,赋值++,并打印

 
    private void OnCollisionEnter2D(Collision2D coll){if (coll.gameObject.name == "qiu"){HitIce hitIce = coll.gameObject.GetComponent<HitIce>();hitIce.score++;Debug.Log(hitIce.score);}}


6.撞击后销毁冰块

冰块检测到小球碰撞到后,延迟一秒销毁自己

Destroy(游戏对象,延迟时间);


7.显示游戏计时

步骤:

  1. 新建两个文本UI,摆放到上方

  2. HitIce脚本加上计时代码

    public Text timerText;void Update(){// Time.time => 游戏运行了多长时间// ToString("f2")转为string,格式为保留两位小数timerText.GetComponent<Text>().text = Time.time.ToString("f2");}


8.显示扔球次数

步骤:

  1. 新建两个文本UI,摆放到中间

  2. 在点击小球的方法中,更改扔球次数的文本

public Text countText;// 点中小球次数加1
count++;
countText.GetComponent<Text>().text = count.ToString();


9.显示剩余冰块个数

步骤:

  1. 新建两个文本UI,摆放到右上角

  2. 创建一个读取剩余冰块个数的方法,获取子对象的总数

  3. 在Start()和Update()中调用

 
    /// <summary>/// 获取剩余冰块总数/// </summary>private void GetResidualIceCount(){// 获取BINGKUAI的子对象  => transform.childCountint residualIceCount = GameObject.Find("BINGKUAI").transform.childCount;residualText.GetComponent<Text>().text = residualIceCount.ToString();}void Start(){GetResidualIceCount();// 让小球向右上方移动//this.GetComponent<Rigidbody2D>().AddForce(new Vector2(100, 100));}void Update(){GetResidualIceCount();


10.游戏结束

步骤:

  1. 新建一个UI文本,Game Over!红色字样,放在屏幕中间

  2. 在GetResidualIceCount() 中判断冰块总数是否为0

  3. 将显示Game Over! 并 将计时调整为0

// 游戏结束
gameOverText.GetComponent<Text>().text = "Game Over!";
timerText.GetComponent<Text>().text = "0";


11.完整代码

1.HitIce

public class HitIce : MonoBehaviour
{public Text timerText;    // 计时的UI文本public Text countText;    // 扔球次数的UI文本public Text residualText; // 剩余冰块的UI文本public Text gameOverText; // 游戏结束的UI文本public int score;         // 分数(小球碰撞的次数)Vector2 startPos; // 记录鼠标按下位置Vector2 endPos;   // 记录鼠标松开位置Vector2 force;    // 记录鼠标方向向量RaycastHit2D hitInfo; // 射线检测到的信息bool isClick;         // 是否点击到小球int count;            // 扔球次数void Start(){GetResidualIceCount();// 让小球向右上方移动//this.GetComponent<Rigidbody2D>().AddForce(new Vector2(100, 100));}void Update(){int residualIceCount = GetResidualIceCount();if (residualIceCount > 0){BallControl();}else{// 游戏结束gameOverText.GetComponent<Text>().text = "Game Over!";timerText.GetComponent<Text>().text = "0";}}/// <summary>/// 获取剩余冰块总数/// </summary>private int GetResidualIceCount(){// Time.time => 游戏运行了多长时间// ToString("f2")转为string,格式为保留两位小数timerText.GetComponent<Text>().text = Time.time.ToString("f2");// 获取BINGKUAI的子对象  => transform.childCountint residualIceCount = GameObject.Find("BINGKUAI").transform.childCount;residualText.GetComponent<Text>().text = residualIceCount.ToString();return residualIceCount;}/// <summary>/// 鼠标控制小球/// </summary>private void BallControl(){// 按下鼠标左键if (Input.GetMouseButtonDown(0)){startPos = Input.mousePosition;// 以鼠标点击的位置向鼠标深处发射一条射线hitInfo = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);// 判断射线是否检测到碰撞体if (hitInfo.collider != null){// 判断检测的到物体名称是否与小球相等if (hitInfo.collider.name == this.name){isClick = true;score = 0;}}}// 松开鼠标左键if (Input.GetMouseButtonUp(0) && isClick){endPos = Input.mousePosition;// 位移方向 = 终点方向 - 起始方向force = endPos - startPos;// 向鼠标位移方向施加力this.GetComponent<Rigidbody2D>().AddForce(force * 2);isClick = false;// 点中小球次数加1count++;countText.GetComponent<Text>().text = count.ToString();}}}

2.PengZhuang

public class PengZhuang : MonoBehaviour
{void Start(){}void Update(){}private void OnCollisionEnter2D(Collision2D coll){if (coll.gameObject.name == "qiu"){HitIce hitIce = coll.gameObject.GetComponent<HitIce>();hitIce.score++;Debug.Log(hitIce.score);Destroy(this.gameObject,0.5f);}}}

这篇关于Unity 学习日记 12.小球撞击冰块游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/859673

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3