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

1.BaoLQManager.cs

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

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; // 初始化开关,允许加力
}
  • 在游戏开始时,初始化 IsShottrue,允许加力。

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 是否存在。

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

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

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

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

总结

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

  1. 初始化:

    • Start 方法中,初始化 IsShottrue,允许加力。
  2. 物理更新:

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

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

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

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

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

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

2.BLqCollision

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

cs 复制代码
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 方法:

    • 初始化 YourScore0
  3. OnCollisionEnter 方法:

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

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

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

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

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

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

  4. OnCollisionExit 方法:

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

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

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

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

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

相关推荐
Q_hd2 分钟前
【Java】Java开发全攻略:从环境搭建到高效编程
java·开发语言
阿汪队3 分钟前
【更新日志】拉克丝大战亚索-2024.09.23
unity·游戏程序·游戏开发·技术美术·独立游戏
卓越软件开发22 分钟前
基于Springboot共享充电宝管理系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解
java·vue.js·spring boot
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑25 分钟前
苍穹外卖学习笔记(九)
java·spring boot·笔记·mybatis
小松学前端39 分钟前
第四章 4.2 时间复杂度
java·数据结构·算法·排序算法
还算善良_41 分钟前
【工具类】综合查询工具类
java
梦睡了41 分钟前
SpringBoot+Thymeleaf租房管理系统
java·spring boot·spring
golove66643 分钟前
Java线程池
java·线程池
影子落人间1 小时前
Spring面试题-Spring是怎么解决循环依赖的?
java·spring·面试
救救孩子把1 小时前
阿里巴巴新推出Java版AI 应用开发框架-Spring AI Alibaba
java·人工智能·spring