【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",则立即销毁保龄球,并输出调试信息,表示立即销毁保龄球。

相关推荐
腥臭腐朽的日子熠熠生辉40 分钟前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian42 分钟前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之1 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码1 小时前
Spring Task 定时任务
java·前端·spring
俏布斯1 小时前
算法日常记录
java·算法·leetcode
27669582921 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿
爱的叹息1 小时前
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
java·redis·spring
Unity大海1 小时前
诠视科技Unity SDK开发环境配置、项目设置、apk打包。
科技·unity·游戏引擎
程序猿chen2 小时前
《JVM考古现场(十五):熵火燎原——从量子递归到热寂晶壁的代码涅槃》
java·jvm·git·后端·java-ee·区块链·量子计算
松韬2 小时前
Spring + Redisson:从 0 到 1 搭建高可用分布式缓存系统
java·redis·分布式·spring·缓存