当前位置: 首页 > article >正文

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

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.kler.cn/a/322996.html

相关文章:

  • C++初阶——日期类的实现
  • 类和对象——拷贝构造函数,赋值运算符重载(C++)
  • 【Pip】如何清理 `pip` 包管理器 —— 完整指南
  • 效率工具-tig的使用
  • 电子电气架构 --- 传统刷写流程怎么用在SOC上就不适用呢?
  • Tessy学习笔记—requirement(需求)的管理
  • Python Daphne库:ASGI服务的高效Web服务器
  • 使用FFmpeg压缩MP3格式音频
  • 利用模糊综合评价法进行数值评分计算——代码实现
  • 基于Java开发的(控制台)模拟的多用户多级目录的文件系统
  • Redis的主要特点及运用场景
  • 【Linux】ubuntu 16.04 搭建jdk 11 环境(亲测可用)
  • 数据结构:特殊矩阵 及其存储
  • 策略路由控制选路
  • apt update时出现证书相关问题,可以关闭apt验证
  • 【Redis 源码】3dict字典数据结构
  • 打点 - 泛微 E-Cology WorkflowServiceXml
  • FPGA学习(3)-38译码器实现
  • LLM基础概念:Prompt
  • LeetCode --- 416周赛
  • Unity图形用户界面!*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。(万字解析)
  • 常用性能优化方法
  • jdk tomcat 镜像制作
  • Activiti7《第九式:破气式》——流畅驱动工作流进程。面试题大全
  • Maya没有Arnold材质球
  • Docker的实践应用举例