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.childCount
        int 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.childCount
        int 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;

            // 点中小球次数加1
            count++;
            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);
        }
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【氮化镓】位错对氮化镓(GaN)电子能量损失谱(EEL)的影响

本文献《Influence of dislocations on electron energy-loss spectra in gallium nitride》由C. J. Fall等人撰写&#xff0c;发表于2002年。研究团队通过第一性原理计算&#xff0c;探讨了位错对氮化镓&#xff08;GaN&#xff09;电子能量损失谱&#xff08;EEL&#xff09;…

八大排序之堆排序

堆排序算法思想&#xff1a; 堆排序是利用二叉树的原理&#xff0c;模拟二叉树将所求的数据放入存放树中&#xff0c;先将所有数据按照大根堆排列&#xff0c;排列之后再依次的给树按从小到大排列. 例如 2 5 44 21 11 6 1 9 我们将数据按照这样的二叉树的形式列举出来&#…

FPGA时钟资源详解(1)——时钟Buffer的选择

FPGA时钟系列文章总览&#xff1a;FPGA原理与结构&#xff08;14&#xff09;——时钟资源https://ztzhang.blog.csdn.net/article/details/132307564 目录 一、概述 二、时钟Buffer的选择 2.1 BUFG 2.2 BUFR 和 BUFIO 2.2.1 源同步接口的支持 2.2.2 扩展时钟域…

DREAM: A Dynamic Scheduler for Dynamic Real-time Multi-model ML Workloads——论文泛读

ASPLOS 2024 Paper 论文阅读笔记整理 问题 新兴的实时多模型ML&#xff08;RTMM&#xff09;工作负载&#xff0c;如AR/VR和无人机控制&#xff0c;涉及各种粒度的动态行为&#xff1a;任务、模型和模型中的层。这种动态行为给ML系统中的系统软件带来了新的挑战&#xff0c;与…

深度学习中不同学习率调整策略

1、StepLR 功能&#xff1a;固定等间隔调整学习率 主要参数&#xff1a; step_size:调整间隔数 gamma&#xff1a;调整系数 调整方式&#xff1a; l r l r ∗ g a m m a lrlr\ast gamma lrlr∗gamma 2、MultiStepLR 功能&#xff1a;按给定间隔调整学习率 主要参数&#xf…

Linux——磁盘与文件系统管理

目录 磁盘分区的表示 硬盘分区 分区类型 确认系统中的磁盘设备——fdisk 规划硬盘中的分区——fdisk 文件系统 文件系统类型&#xff1a; 在分区中创建文件系统——mkfs&#xff0c;mkswap 挂载文件系统 mount命令 umount命令 查看分区挂载情况 设置启动载入&…

负荷频率控制LFC,自抗扰ADRC控制,麻雀SSA算法优化自抗扰参数,两区域二次调频simulink/matlab

红色曲线为优化结果&#xff0c;蓝色曲线为没有自抗扰和没有优化的结果&#xff01;

Mac系统中使用VSCode安装C#开发环境进行编译调试

VSCode安装插件 C#c# Dev Kit 安装Mac版本 .net .net下载地址 查看安装结果 dotnet --list-sdksdotnet --info配置环境变量 open -e ~/.bash_profile添加如下内容 export DOTNET_ROOT/usr/local/share/dotnet export PATH$PATH:$DOTNET_ROOT终端重新加载配置文件 sourc…

原子激光器(原子激射器)可发射相干原子束 目前仍处于技术研究阶段

原子激光器&#xff08;原子激射器&#xff09;可发射相干原子束 目前仍处于技术研究阶段 原子激光器&#xff0c;也称为原子激射器&#xff0c;是一种能够产生原子激光的器件。原子激光由粒子组成&#xff0c;拥有频率和波长&#xff0c;原子激光器受激发射电磁波&#xff0c;…

顺丰接口接入-主要处理下单接口上电子面单上传问题

概述 最近接到一个需求&#xff0c;需要和顺丰接口对接。由于是第一次对接&#xff0c;就需要把所有的流程全部走一遍&#xff0c;从 注册到 关联API 以及代码测试&#xff0c;电子面单审核&#xff0c;上线&#xff0c;下面就分开来说明把。本来是想着偷懒来着&#xff0c;作…

Days 35 ElfBoard板对Java的支持

Java作为一种功能强大且广泛应用的编程语言&#xff0c;具有广泛的适应性和实用性。在ELF 1开发板上集成Java支持&#xff0c;无疑将赋予嵌入式开发者更广阔的选择空间&#xff0c;今天就为各位小伙伴详细解析如何在ELF 1开发板上成功部署和运行Java环境。 1.拷贝两个压缩包到E…

FME学习之旅---day14

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 【FME-HOW-TO系列】13 通过重新采样修改栅格像元大小 除了使用RasterResampler转换器进行重采样的操作外&#xff0c;还需要了解不同的插值方法&#xff0c;各方法大概的不同。 可以参考ArcG…

计算机网络(二)物理层

物理层 一、通信基础1.奈氏准则、香农定理2.编码与调制3.电路交换、报文交换、分组交换 二、 传输介质、设备1.导向性传输介质&#xff1a;1.1双绞线1.2 同轴电缆1.3光纤 2.非导向性传输介质&#xff1a; 一、通信基础 信道带宽&#xff1a;信道能通过的最高频率和最低频率之差…

学浪视频提取

经过调查,学浪这个学习平台越来越多人使用了,但是学浪视频官方没有提供下载按钮,为了让这些人能够随时随地的观看视频,于是我钻研学浪视频的下载,终于研究出来了并且做成软件批量版 下面是学浪视频提取的软件,有需要的自己下载一下 链接&#xff1a;https://pan.baidu.com/s/…

Chrome之解决:浏览器插件不能使用问题(十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

[flask]http请求//获取请求头信息+客户端信息

在网站中查询请求头信息&#xff0c;可以通过以下操作进行 右键然后选择检查 进入改页面后选择文档&#xff0c;刷新一下页面就好了 获取所有的请求头信息 print(request.headers, type(request.headers)) 在flask模块中&#xff0c;使用上面的输出函数就可以查看到有关于请求…

软考高级架构师:云原生架构概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

企业计算机服务器中了mkp勒索病毒怎么办,mkp勒索病毒解密流程步骤

在网络技术飞速发展的今天&#xff0c;越来越多的企业走向了数字化办公模式&#xff0c;网络为企业的生产运营提高了效率&#xff0c;为企业带来了极大便利&#xff0c;但网络是一把双刃剑&#xff0c;在为人们提供便利的同时也会带来数据安全问题&#xff0c;网络数据安全一直…

There is no getter for property named ‘deleted‘

实体类在继承BaseEntity的时候,由于没填写deleted参数名导致mybatis报错 这时候要么改application.yml里的mybatis参数&#x1f447; 要么就将BaseEntity基类的delete上加个existfalse&#x1f447;(推荐)

【单例模式】—— C++设计模式【附百度Apollo单例模式详细解读】

参考资料&#xff1a; &#xff08;1&#xff09;单例模式—— 代码随想录 &#xff08;2&#xff09;我给面试官讲解了单例模式后&#xff0c;他对我竖起了大拇指&#xff01; &#xff08;3&#xff09;C 单例模式详解 &#xff08;4&#xff09;单例模式之C实现&#xff0c;…