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.rhkb.cn/news/293786.html

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

相关文章

讲解pwngdb的用法,以csapp的bomb lab phase_1为例

参考资料 Guide to Faster, Less Frustrating Debugging 什么情况下会使用gbd 需要逆向ELF文件时(掌握gdb的使用&#xff0c;是二进制安全的基本功)开发程序时&#xff0c;程序执行结果不符合预期 动态调试ELF文件可以使用另外一种方法&#xff1a;IDA的远程linux动态调试。个…

AI在行业大模型中的机会及爆发赚钱的行业有哪些?

人工智能(AI)正逐渐成为驱动各行业发展的核心力量,尤其是在应用层,AI结合具体细分领域所带来的生产力提升是巨大的。随着技术的不断进步和人口老龄化趋势的加剧,AI将在多个行业中发挥关键作用,为这些行业带来爆发式增长和丰厚的利润。 一、医疗行业:AI辅助诊断的崛起…

蓝桥杯刷题_day7_动态规划_路径问题

文章目录 DAY7下降路径最小和最小路径和地下城游戏 DAY7 下降路径最小和 【题目描述】 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元…

FreeRTOS_day2:2024/4/1

1.总结串口的发送和接收功能使用到的函数(见思维导图) 2.总结DMA的作用&#xff0c;和DMA空闲中断的使用方式(见思维导图) 3.使用PWMADC光敏电阻完成光控灯的实验 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration------------------------…

CentOS7安装DockerCompose

1.CentOS7安装DockerCompose 1.1.下载 Linux下需要通过命令下载&#xff1a; # 安装 curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose1.2.修改文件权限 修改文件权限&#xff1a…

CrossOver玩游戏会损害电脑吗 CrossOver玩游戏会卡吗 Mac玩游戏 crossover24免费激活

CrossOver是一款可以在macOS上运行Windows应用程序的软件&#xff0c;它利用了Wine技术&#xff0c;无需安装虚拟机或双系统&#xff0c;可以直接在苹果系统下运行Windows游戏。那么&#xff0c;使用CrossOver玩游戏会损害电脑吗&#xff1f;CrossOver玩游戏会卡吗&#xff1f;…

校园招聘管理系统(源码+文档)

校园招聘管理系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端热门岗位校园招聘首页个人简历添加个人简历我的界面注册界面查看个人简历界面个人资料界面登录界面消息界面退出登录 管理端登录界面![请添加图片描述](htt…

vite vue3 import.meta.glob动态路由

在Vite中使用Vue 3&#xff0c;你可以使用import.meta.glob来导入目录下的多个Vue组件&#xff0c;并自动生成路由。以下是一个简单的例子&#xff1a; router/index.js // router/index.js import { createRouter, createWebHistory } from vue-router;// 自动导入views目录下…

性能测试必备docker环境准备

在当今快速发展的软件开发领域&#xff0c;docker作为一种开源的容器化技术&#xff0c;已经成为提高应用部署效率、实现快速、一致的环境配置的重要工具。而性能测试&#xff0c;则是确保软件应用在各种负载和压力条件下表现良好的关键步骤。二者的结合&#xff0c;为软件开发…

35岁的前阿里员工:薪资从46K降到40K进传统企业,太香了,8.30上班,5点下班

互联网大厂&#xff0c;对每一位程序员而言都是一个向往的地方。高薪、高压、高目标&#xff0c;每个人都为之奋斗不止。然而&#xff0c;在光鲜亮丽的外表之下&#xff0c;却隐藏着无数的焦虑与疲惫。 35岁&#xff0c;对于一个程序员来说&#xff0c;似乎是一个被现实无情提…

Docker搭建LNMP环境实战(05):CentOS环境安装Docker-CE

前面几篇文章讲了那么多似乎和Docker无关的实战操作&#xff0c;本篇总算开始说到Docker了。 1、关于Docker 1.1、什么是Docker Docker概念就是大概了解一下就可以&#xff0c;还是引用一下百度百科吧&#xff1a; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以…

YOLOv8改进 | 检测头篇 | 2024最新HyCTAS模型提出SAttention(自研轻量化检测头 -> 适用分割、Pose、目标检测)

一、本文介绍 本文给大家带来的改进机制是由全新SOTA分割模型(Real-Time Image Segmentation via Hybrid Convolutional-TransformerArchitecture Search)HyCTAS提出的一种SelfAttention注意力机制,论文中叫该机制应用于检测头当中(论文中的分割效果展现目前是最好的)。我…

机器学习在智能音箱中的应用探索与实践:让声音更懂你

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

Android ImageView以及实现截图

实现效果 截图前 截图后 代码 package cn.jj.huaweiad;import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.ViewGro…

Android开发 OCR:通过Tesseract实现图片文字识别

下面是整个详解步骤过程 效果图一、OCR的含义二、什么是Tesseract三、前提准备1、添加依赖2、数据文件下载路径 四、实际代码案例Demo如下&#xff1a;Main.xmlMain.java 效果图 流程&#xff1a;获取assets中的图片显示到页面&#xff0c;提取照片内的文字 一、OCR的含义 o…

单一职责原则

1.1 阅读干吗不直接用手机&#xff1f; 电子阅读器比较专注&#xff0c;而手机功能比较多&#xff0c;影响专注。 1.2 手机不纯粹 手机确实很方便。但是现在的手机就是一台小型智能电脑。它不仅能打电话&#xff0c;还能听音乐、看电影电视、与个人交流、与一群人群聊&#…

基于Unity+Vue3通信交互的WebGL项目发布实践

基于UnityVue3通信交互的WebGL项目发布实践 实践路线 基于UnityVue3通信交互的WebGL项目发布实践问题背景准备工作解决方案项目实践小目标搭建Unity测试项目 创建Vue3测试项目运行项目验证unity和vue通信功能总结与展望 问题背景 我们最近需要把unity开发的pc项目迁移到web端&…

设计方案-定时任务接口数据存储及更新策略

前言 在没有使用ETL工具且不考虑多数据源的情况下&#xff0c;我们需要从别的系统获取数据时&#xff0c;一般会选择分页接口查询并存储。本文算是我对类似场景代码的提炼&#xff0c;旨在总结相关套路&#xff0c;提升自我对数据库和模块的设计能力。 ETL(英文 Extract-Trans…

Prometheus +Grafana +node_exporter可视化监控Linux + windows虚机

1、介绍 背景&#xff1a;需要对多台虚机进行负载可视乎监控&#xff0c;并进行及时的报警 2、架构图 node_exporter &#xff1a;主要是负责采集服务器的信息。 Prometheus &#xff1a;主要是负责存储、抓取、聚合、查询方面。 Grafana &#xff1a; 主要是…

JMeter 测试脚本编写技巧

JMeter 是一款开源软件&#xff0c;用于进行负载测试、性能测试及功能测试。测试人员可以使用 JMeter 编写测试脚本&#xff0c;模拟多种不同的负载情况&#xff0c;从而评估系统的性能和稳定性。以下是编写 JMeter 测试脚本的步骤。 第 1 步&#xff1a;创建测试计划 在JMet…