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

news2024/9/22 11:30:19

目录

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

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Idea2023.3.6版本无法启动设置界面-settings界面打不开无反应---IntelliJ Idea工作笔记013

先说一下网上有,把某个文件删除的 有说是因为汉化问题的 可以看到,其实都不是,这样弄就好了,很简单 Please report thisjava.lang.ClassCastException: class [Lcom.intellij.execution.filters.CompositeInputFilter$InputFilterWrapper; cannot be cast to class java.uti…

关于使用vscode搭建c/c++编程环境

目录 关于使用vscode搭建c/c编程环境一、前言二、安装 IDE 二、安装TDM-GCC安装三、安装C/C环境四、编写代码并进行编译 关于使用vscode搭建c/c编程环境 一、前言 一直觉得vscode是生产强有力的生产工具&#xff0c;基于此&#xff0c;做一篇学习笔记进行记录。 二、安装 ID…

洛谷 P1379 八数码难题

代码如下&#xff1a; #include<bits/stdc.h> using namespace std; struct node{string s;int pos; }star,en; map<string,int>mp[2]; queue<node>q[2]; int main(){cin>>star.s;en.s"123804765";for(int i0;i<9;i){if(star.s[i]0) sta…

服务器停止解析域名,但仍然可以访问到

1.centos7 如何刷新dns缓存 在CentOS 7上&#xff0c;DNS缓存由nscd&#xff08;Name Service Cache Daemon&#xff09;管理&#xff0c;如果系统上安装了nscd&#xff0c;可以通过清除nscd缓存来刷新DNS缓存。 要刷新DNS缓存&#xff0c;请执行以下命令&#xff1a; sudo …

【XXL-JOB】执行器架构设计和源码解析

简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 XXL-JOB分为B/S架构&#xff0c;调用中心是XXL-JOB服务端&#xff0c;执行器是客户端。 调度中心核…

入门指南|营销中人工智能生成内容的主要类型 [新数据、示例和技巧]

由于人工智能技术的进步&#xff0c;内容生成不再是一项令人头疼的任务。随着人工智能越来越多地接管手动内容制作任务&#xff0c;营销人员明智的做法是了解现有的不同类型的人工智能生成内容&#xff0c;以及哪些内容从中受益最多。这些工具可以帮助我们制作对您的受众和品牌…

3.28C++

复数类的实现&#xff0c;写出三种构造函数&#xff0c;算术运算符、关系运算符、逻辑运算符重载尝试实现自增、自减运算符的重载 #include <iostream> using namespace std; class Num {int rel; //实部int vir; //虚部 public:Num():rel(2),vir(1){}Num(int rel,…

若依 3.8.7版本springboot前后端分离 整合mabatis plus

1.去掉mybatis 这一步我没有操作&#xff0c;看别人的博客有说不去掉可能冲突&#xff0c;也可能不冲突&#xff0c;我试下来就没去掉如需要去除&#xff0c;到总的pom.xml中properties标签下的<mybatis-spring-boot.version>x.x.x</mybatis-spring-boot.version>…

如何在极狐GitLab 自定义 Pages 域名、SSL/TLS 证书

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

深圳区块链交易所app系统开发,撮合交易系统开发

随着区块链技术的迅速发展和数字资产市场的蓬勃发展&#xff0c;区块链交易所成为了数字资产交易的核心场所之一。在这个快速发展的领域中&#xff0c;区块链交易所App系统的开发和撮合交易系统的建设至关重要。本文将探讨区块链交易所App系统开发及撮合交易系统的重要性&#…

包子凑数(蓝桥杯,闫氏DP分析法)

题目描述&#xff1a; 小明几乎每天早晨都会在一家包子铺吃早餐。 他发现这家包子铺有 N 种蒸笼&#xff0c;其中第 i 种蒸笼恰好能放 Ai 个包子。 每种蒸笼都有非常多笼&#xff0c;可以认为是无限笼。 每当有顾客想买 X 个包子&#xff0c;卖包子的大叔就会迅速选出若干笼…

解决:PytorchStreamWriter failed writing file data

文章目录 问题内容问题分析解决思路 问题内容 今天在炼丹的时候&#xff0c;我发现模型跑到140步的时候保存权重突然报了个问题&#xff0c;详细内容如下&#xff1a; Traceback (most recent call last):File "/public/home/dyedd/.conda/envs/diffusers/lib/python3.8…

uniapp输入框事件(防抖)

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

2024年第十届国际虚拟现实大会(ICVR 2024)即将召开!

会议面向虚拟现实、增强现实、人工智能等互联网新技术领域的专家及学者&#xff0c; 致力于共同促进国内外虚拟现实的发展与应用。 2014年至今&#xff0c;ICVR在全球新加坡&#xff0c;美国洛杉矶&#xff0c;中国成都&#xff0c;香港等国家及地区召开&#xff0c;面向虚拟现…

力扣面试150 二叉搜索树的最小绝对差 中序遍历

Problem: 530. 二叉搜索树的最小绝对差 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 录哥题解 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code // 递归 class Solution {int ans Integer.MAX_VALUE;TreeNode pre;//一开…

C++的非类型模板参数与模板分离编译(模板显式实例化)

非类型模板参数与模板分离编译&#xff08;模板显式实例化&#xff09; 文章目录 非类型模板参数与模板分离编译&#xff08;模板显式实例化&#xff09;前言一、非类型模板参数二、模版分离编译1. 分离编译概念2. 模版的分离编译问题案例解决方法 总结 前言 ​ 本篇博客文章介…

vue2源码解析——Vue.set/$set方法如何给响应式对象添加属性

在Vue 2中需要向响应式对象添加新属性时&#xff0c;可以使用Vue.set或$set方法来实现。这两个方法的作用是向响应式对象添加属性并确保这个新属性也是响应式的。 为什么会有vue.set方法 Vue提供了Vue.set方法主要是为了解决在Vue 2.x 中动态添加属性时可能遇到的响应性问题。 …

八大技术趋势案例(区块链量子计算)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

钡铼技术R40路由器助力智能船舶航行数据实时传输与分析

钡铼技术R40路由器在智能船舶领域的应用&#xff0c;对于航行数据的实时传输与分析具有重要意义。随着航运业的不断发展和智能化水平的提升&#xff0c;船舶航行数据的及时传输和有效分析对船舶的安全、运营效率等方面至关重要。而引入钡铼技术R40路由器&#xff0c;则可以实现…

前后端分离开发【Yapi平台】【Swagger注解自动生成接口文档平台】

前后端分离开发 介绍开发流程Yapi&#xff08;api接口文档编写平台&#xff09;介绍 Swagger使用方式1). 导入knife4j的maven坐标2). 导入knife4j相关配置类3). 设置静态资源映射4). 在LoginCheckFilter中设置不需要处理的请求路径 查看接口文档常用注解注解介绍 当前项目中&am…