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);}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/575788.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32和GD32内部时钟与外部时钟讲解

STM32F103为例: 1. 当 HSI 被用作 PLL 时钟输入时,可以实现的最大系统时钟频率为 64 MHz。 2. 要使 USB 功能可用,必须同时启用 HSE 和 PLL,并使 USBCLK 运行在 48 MHz。 3. 要实现 ADC 转换时间为 1 s,APB2 必须为 14 MHz、28 MHz 或 56 MHz。 ①. HSE = 高速外部时钟信号…

Adobe最近推出了Firefly AI的结构参考以及面向品牌的GenStudio

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

VMware vSAN OSA存储策略 - 基于虚拟机的分布式对象存储

简介 博客&#xff1a;https://songxwn.com/ 存储策略 (Storage Policy) 是管理员定义的一组规则&#xff0c;这组规则定义了数据对象在 vSAN 存储上是如何保存的&#xff0c;存储策略定义了数据存储的可靠性、访问性能等特性。vSAN 提供了基于存储策略的存储管理 SPBM (Stor…

uniapp输入框事件(防抖)

一、描述 在输入框输入内容或者说输入关键词的时候&#xff0c;往往都要进行做防抖处理。如果不做防抖&#xff0c;你输入什么&#xff0c;动态绑定的数据就会保持一致。这样不好吗&#xff0c;同步获取。有个业务场景&#xff0c;如果是搜索框&#xff0c;你每次一个字符&…

【踩坑】使用CenterNet训练自己的数据时的环境配置与踩坑

环境配置 系统&#xff1a;Ubuntu22.04 Python&#xff1a;3.8 CUDA&#xff1a;11.7 pytorch&#xff1a;2.2.1 因为种种原因没有使用原工程的老版本python和pytorch……但总之也跑通了&#xff0c;可喜可贺&#xff0c;可喜可贺。 新建conda环境&#xff1a; conda create -…

linux nginx配置ssl, 实现https+ip访问

mkdir sslZhengShu openssl req -newkey rsa:2048 -nodes -keyout ca.key -out ca.csr openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt openssl genrsa -out server.key 2048 openssl req -new -key server.key -out server.csr 和之前输入一样即可 …

Postman测试含有变量的接口的方法

1.在路径中用/&#xff1a;设置变量名 2.设置token验证 3.填写参数

Java安全篇-Fastjson漏洞

前言知识&#xff1a; 一、json 概念&#xff1a; json全称是JavaScript object notation。即JavaScript对象标记法&#xff0c;使用键值对进行信息的存储。 格式&#xff1a; {"name":"wenda","age":21,} 作用&#xff1a; JSON 可以作为…

win11蓝牙图标点击变灰,修复过程

问题发现 有一天突然心血来潮想着连接蓝牙音响放歌来听,才发现win11系统右下角菜单里的蓝牙开关有问题。 打开蓝牙设置,可以正常直接连上并播放声音,点击右下角菜单里的蓝牙开关按钮后,蓝牙设备也能正常断开,但是按钮直接变深灰色,无法再点击打开。 重启电脑,蓝牙开关显…

基于vue的MOBA类游戏攻略分享平台的设计与实现|Springboot+Vue+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. …

LockSupport与线程中断机制

中断机制是个协商机制 Interrupt(): 将中断状态设置为true Interrupted():&#xff08;静态方法&#xff09; 1.返回当前线程的中断状态 2.将中断状态清零并设置为false is Interrupted(): 判断当前线程是否被中断 如何停止中断运行中的线程&#xff1f; 一个线程不应该由…

macOS Sonoma如何查看隐藏文件

在使用Git进行项目版本控制时&#xff0c;我们可能会遇到一些隐藏文件&#xff0c;比如.gitkeep文件。它通常出现在Git项目的子目录中&#xff0c;主要作用是确保空目录也可以被跟踪。 终端命令 在尝试查看.gitkeep文件时&#xff0c;使用Terminal命令来显示隐藏文件 default…