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

相关文章

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

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert