【Unity保龄球项目】的实现逻辑以及代码解释

news2024/12/23 6:58:48

1.BaoLQManager.cs

这个脚本实现了基本的保龄球游戏逻辑,包括扔球功能。 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BaoLQManager : MonoBehaviour
{
    // 业务逻辑1:把保龄球扔出去
    // 业务逻辑2:保龄球走直线把前面的柱子撞倒
    // 业务逻辑3:如果撞倒一个就+一分
    // 业务逻辑4:如果撞到以后-间隔2秒消失

    // 程序逻辑1:把球和被撞柱子存到代码变量里

    // 程序逻辑2:当用户按下空格或者左键,就用Rigidbody类给球添加一个力 - 业务逻辑1:把保龄球扔出去

    // 程序逻辑3:Collider类-碰撞检测,如果有人碰到我,我就让变量+1加分

    public Rigidbody BaoLqRIGI; // 获取保龄球的刚体组件
    public float ForceStrength = 100f; // 定义施加力的强度
    bool IsShot = true; // 这是一个开关,用来控制是否允许加力

    void Start()
    {
        IsShot = true; // 初始化开关,允许加力
    }

    void FixedUpdate()
    {
        // 检查保龄球的刚体组件是否存在
        if (BaoLqRIGI != null)
        {
            // 检查用户是否按下鼠标左键或空格键,并且是否允许加力
            if ((Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)) && IsShot)
            {
                // 给保龄球添加一个爆发力,方向为正Z轴,力的大小为ForceStrength
                BaoLqRIGI.AddForce(new Vector3(0, 0, 1 * ForceStrength * Time.deltaTime), ForceMode.Impulse);
                // 设置开关为false,防止重复加力
                IsShot = false;
            }
        }
        else
        {
            // 如果保龄球的刚体组件不存在,输出调试信息
            Debug.Log("你的球已经没有了,怎么还在点");
        }
    }

  
 
    
}

脚本概述

这个脚本名为 BaoLQManager,主要负责控制保龄球的行为,包括:

  1. 将保龄球扔出去。

  2. 保龄球走直线把前面的柱子撞倒。

  3. 如果撞倒一个柱子就加一分。

  4. 如果撞到柱子后,间隔2秒消失。

变量声明

csharp

复制

public Rigidbody BaoLqRIGI; // 获取保龄球的刚体组件
public float ForceStrength = 100f; // 定义施加力的强度
bool IsShot = true; // 这是一个开关,用来控制是否允许加力
  • BaoLqRIGI:保龄球的刚体组件,用于控制保龄球的运动。

  • ForceStrength:施加力的强度,控制保龄球被扔出去的力度。

  • IsShot:一个开关变量,用于控制是否允许给保龄球加力。

Start 方法

csharp

复制

void Start()
{
    IsShot = true; // 初始化开关,允许加力
}
  • 在游戏开始时,初始化 IsShot 为 true,允许加力。

FixedUpdate 方法

csharp

复制

void FixedUpdate()
{
    // 检查保龄球的刚体组件是否存在
    if (BaoLqRIGI != null)
    {
        // 检查用户是否按下鼠标左键或空格键,并且是否允许加力
        if ((Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)) && IsShot)
        {
            // 给保龄球添加一个爆发力,方向为正Z轴,力的大小为ForceStrength
            BaoLqRIGI.AddForce(new Vector3(0, 0, 1 * ForceStrength * Time.deltaTime), ForceMode.Impulse);
            // 设置开关为false,防止重复加力
            IsShot = false;
        }
    }
    else
    {
        // 如果保龄球的刚体组件不存在,输出调试信息
        Debug.Log("你的球已经没有了,怎么还在点");
    }
}
  • FixedUpdate 方法在每一帧中调用,用于处理物理相关的更新。

  • 首先检查保龄球的刚体组件 BaoLqRIGI 是否存在。

    • 如果存在,检查用户是否按下鼠标左键或空格键,并且 IsShot 为 true

      • 如果条件满足,给保龄球施加一个爆发力,方向为正Z轴,力的大小为 ForceStrength

      • 施加力后,将 IsShot 设置为 false,防止重复加力。

    • 如果保龄球的刚体组件不存在,输出调试信息。

总结

这个脚本的逻辑可以总结为以下几个步骤:

  1. 初始化:

    • 在 Start 方法中,初始化 IsShot 为 true,允许加力。

  2. 物理更新:

    • 在 FixedUpdate 方法中,每一帧检查保龄球的刚体组件是否存在。

    • 如果存在,检查用户是否按下鼠标左键或空格键,并且 IsShot 为 true

    • 如果条件满足,给保龄球施加一个爆发力,方向为正Z轴,力的大小为 ForceStrength

    • 施加力后,将 IsShot 设置为 false,防止重复加力。

    • 如果保龄球的刚体组件不存在,输出调试信息。

这个脚本实现了基本的保龄球扔出去的功能,通过用户输入来控制保龄球的运动。后续可以扩展这个脚本,添加碰撞检测、分数计算和柱子消失等功能。

2.BLqCollision  

这个脚本实现了保龄球的碰撞检测和分数计算功能,并且在特定条件下销毁碰撞到的物体或保龄球本身。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BLqCollision : MonoBehaviour
{
    // 这个脚本实现,以保龄球的视角做碰撞检测,检测有没有碰到别人,如果碰到了就返回个信号

    int YourScore; // 定义一个整数变量,用于存储分数

    void Start()
    {
        YourScore = 0; // 初始化分数为0
    }

    // 当有物体碰撞到保龄球时调用此方法
    private void OnCollisionEnter(Collision collision) // 执行入口
    {
        // 这里是碰撞检测,一旦有物体碰到了我所在的脚本所挂的物体,就会被执行一次
        Debug.Log("有人碰到我了"); // 输出调试信息,表示有物体碰撞到了保龄球

        string name = collision.gameObject.name; // 获取碰撞到的物体的名称

        // 检查碰撞到的物体是否是 "Road" 或 "Plane"
        if (name == "Road" || name == "Plane")
        {
            Debug.Log("不好意思,没撞到,再接再厉!"); // 输出调试信息,表示没有撞到有效的目标
        }
        else
        {
            YourScore = YourScore + 1; // 如果碰撞到的不是 "Road" 或 "Plane",则分数加1
            Debug.Log("我的分数是:" + YourScore + " 我碰到的花瓶叫:" + name); // 输出调试信息,显示当前分数和碰撞到的物体名称
        }
    }

    // 当保龄球离开一个碰撞器时调用此方法
    private void OnCollisionExit(Collision collision)
    {
        Debug.Log("球离开了一个碰撞器,离开的对象叫:" + collision.gameObject.name); // 输出调试信息,表示保龄球离开了某个碰撞器

        // 检查离开的物体是否是 "Road"
        if (collision.gameObject.name != "Road")
        {
            GameObject.Destroy(collision.gameObject, 2f); // 如果不是 "Road",则在2秒后销毁离开的物体
        }
        else
        {
            // 如果保龄球离开了 "Road",则立即销毁球
            Debug.Log("立即销毁球"); // 输出调试信息,表示立即销毁保龄球
            GameObject.Destroy(this.gameObject); // 销毁保龄球
        }
    }
}

详细注释:

  1. 变量声明:

    • YourScore:一个整数变量,用于存储分数。

  2. Start 方法:

    • 初始化 YourScore 为 0

  3. OnCollisionEnter 方法:

    • 当有物体碰撞到保龄球时调用此方法。

    • 输出调试信息,表示有物体碰撞到了保龄球。

    • 获取碰撞到的物体的名称。

    • 检查碰撞到的物体是否是 "Road" 或 "Plane"。

      • 如果是 "Road" 或 "Plane",输出调试信息,表示没有撞到有效的目标。

      • 如果不是 "Road" 或 "Plane",则分数加1,并输出调试信息,显示当前分数和碰撞到的物体名称。

  4. OnCollisionExit 方法:

    • 当保龄球离开一个碰撞器时调用此方法。

    • 输出调试信息,表示保龄球离开了某个碰撞器。

    • 检查离开的物体是否是 "Road"。

      • 如果不是 "Road",则在2秒后销毁离开的物体。

      • 如果是 "Road",则立即销毁保龄球,并输出调试信息,表示立即销毁保龄球。

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

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

相关文章

react hooks--useRef

基本用法 在类组件中获取一个dom元素实例,可以通过React.CreateRef或者回调函数的方式去获取。语法:const refContainer useRef(initialValue);使用场景:在 React 中进行 DOM 操作时,用来获取 DOM作用:返回一个带有 …

TensorRT | 在多个GPU中指定推理设备

说实话,之前我在笔记本上都一直都是只有一块N卡,所以没有过多关注过这个问题。然而昨天有个人问我,TensorRT怎么在多个GPU中指定模型推理GPU设备?我查了一下,发现官方有几个不同的解决方案,个人总结了一下&…

面经 | webpack

webpack webpackloader基本语法rules自定义loader 你可以写哪些loader?常见loader pluginwebpack生命周期 [参考](https://blog.csdn.net/qq_17335549/article/details/137561075)常见plugin webpack 一个打包工具,就和npm是一个包管理工具差不多。一般…

聚观早报 | 小米新车规划曝光;北京汽车官宣更换标志

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 9月24日消息 小米新车规划曝光 北京汽车官宣更换标志 转转全资收购红布林 全新岚图梦想家乾崑版上市 微软拟推出…

SpringCloud各依赖版本选择、核心功能与组件、创建项目(注意事项、依赖)

目录 1. 各依赖版本选择2. 核心功能与组件3. 创建项目3.1 注意事项3.2 依赖 1. 各依赖版本选择 SpringCloud: 2023.0.1SpringBoot: 3.2.4。参考Spring Cloud Train Reference Documentation选择版本 SpringCloud Alibaba: 2023.0.1.0*: 参考Spring Cloud Alibaba选择版本。同时…

深度学习——线性回归

房价预测 线性模型 单层神经网络 损失函数的均方误差 训练数据 参数学习 显示解 偏导数少了负号 最优解y旁边的X少了转置符号 梯度下降 学习率选择 小批量随机梯度下降 批量规模的选择 总结

【机器学习-无监督学习】k均值聚类

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…

ANSYS Workbench随机球体多孔结构三维模型

三维多孔结构广泛存在于材料科学、生物医学工程、土木工程等领域,如泡沫金属、骨组织、过滤介质等,通过ANSYS Workbench对三维多孔结构进行有限元模拟,是对其进行性能分析的有效手段。 在ANSYS内建立多孔结构模型可采用CAD随机球体插件专业…

Linux查看java服务所在目录

1、java服务jar的PID jps -l 2、定位目录 ls -l /proc/[pid]/cwd

关于QSizeGrip在ui界面存在布局的情况下的不显示问题

直接重写resizeEvent你会发现:grip并没有显示 void XXXXX::resizeEvent(QResizeEvent *event) {QWidget::resizeEvent(event);this->m_sizeGrip->move(this->width() - this->m_sizeGrip->width() - 3,this->height() - this->m_sizeGrip->…

[spring]MyBatis介绍 及 用MyBatis注解操作简单数据库

文章目录 一. 什么是MyBatis二. MyBatis操作数据库步骤(使用注解)创建工程创建数据库创建对应实体类配置数据库连接字符串写持久层代码单元测试 三. MyBatis基础操作 使用注解打印日志参数传递增删改查 一. 什么是MyBatis 简单来说 MyBatis 是更简单完成程序和数据库交互的框架…

langchain的构成

1.简介 langchain的构成其包含langchain-core,langchain-community,langchain,langgraph,langserve,langSmith。 2,构件的详解 ‌LangChain Core‌ ‌LangChain Core‌是LangChain框架的核心组成部分,它包含了不同组件的基本抽象以及将它们组合在一起…

ruoyi-flowable流程设计配置的表单时,级联选择如何配置??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

为什么自学python那么难?

在科技日新月异的今天,编程能力已成为一项备受追捧的技能。仿佛一夜之间,各种编程学习资源如雨后春笋般涌现,让人眼花缭乱。然而,许多人投身于自学编程的行列,却往往在半路折戟沉沙。究竟是什么原因让自学编程变得如此…

如何重置企业/媒体/组织/个体户类型管理员微信号

请您通过浏览器打开该网页https://mp.weixin.qq.com/acct/findacct?actionscan重置公众号绑定邮箱和管理员微信号, 在申请找回帐号的页面填写的对公账户信息和运营者信息可以和注册不一致,完成找回后,管理员微信号会同步更新; …

【小程序】微信小程序课程 -3 快速上手之常用方法

目录 1、 对话框 1.1 模态对话框 1.2 消息对话框 2、 存储 2.1 同步 2.1.1 同步保存数据 2.1.2 同步获取数据 2.1.3 同步删除数据 2.1.4 同步清空数据 2.2 异步 2.2.1 异步保存数据 2.2.2 异步获取数据 2.2.3 异步删除数据 2.2.4 异步清空数据 3、 上拉加载更多…

代码随想录算法训练营第三十八天 | 322. 零钱兑换,279.完全平方数,139.单词拆分,多重背包

322.零钱兑换 题目链接 解题过程 递推公式写对了&#xff0c;但对于特殊情况的案例没有想清楚&#xff0c;如不能凑成则需返回-1dp[i] min(dp[i], dp[i - coin] 1); 完全背包 class Solution { public:int coinChange(vector<int>& coins, int amount) {vector…

SSM影院订票系统—计算机毕业设计源码35370

摘 要 随着互联网时代的到来&#xff0c;同时计算机网络技术高速发展&#xff0c;网络管理运用也变得越来越广泛。因此&#xff0c;建立一个SSM影院订票系统&#xff1b;订票系统的管理工作系统化、规范化&#xff0c;也会提高平台形象&#xff0c;提高管理效率。 本影院订票系…

11周年 | 初心不改,焕新前行,奔赴下一个10年!

2024年8月13日&#xff0c;爱加密正式迎来了11岁生日&#xff0c;在爱加密肩负着崇高使命踏浪而行的10年间&#xff0c;蓝绿色的品牌标识一直伴于左右。随着时代的变迁以及市场需求的不断变化&#xff0c;企业同样也需要在品牌上做出创新递进&#xff0c;从而更加适应市场竞争的…

AI知识库助力电商企业打造精准营销策略

在数字化时代&#xff0c;电商行业的竞争日益激烈&#xff0c;消费者需求的多样化和个性化趋势愈发明显。为了在这场没有硝烟的战争中脱颖而出&#xff0c;电商企业纷纷借助人工智能技术&#xff0c;特别是AI知识库&#xff0c;来打造更加精准、高效的营销策略。本文将深入探讨…