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

相关推荐
鹿野素材屋4 分钟前
Unity Dots下的动画合批工具:GPU ECS Animation Baker
unity·游戏引擎
小叶lr8 分钟前
idea 配置 leetcode插件 代码模版
java·leetcode·intellij-idea
qq_4298565712 分钟前
idea启动服务报错Application run failed
java·ide·intellij-idea
瑞雨溪14 分钟前
java中的this关键字
java·开发语言
J不A秃V头A22 分钟前
Redisson 中开启看门狗(watchdog)机制
java·分布式锁·看门狗
草字24 分钟前
uniapp input限制输入负数,以及保留小数点两位.
java·前端·uni-app
李迟25 分钟前
某Linux发行版本无法使用nodejs程序重命名文件问题的研究
java·linux·服务器
MapleLea1f38 分钟前
26届JAVA 学习日记——Day14
java·开发语言·学习·tcp/ip·程序人生·学习方法
没有黑科技44 分钟前
基于web的音乐网站(Java+SpringBoot+Mysql)
java·前端·spring boot
爪哇学长1 小时前
解锁API的无限潜力:RESTful、SOAP、GraphQL和Webhooks的应用前景
java·开发语言·后端·restful·graphql