【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轴,力的大小为ForceStrengthBaoLqRIGI.AddForce(new Vector3(0, 0, 1 * ForceStrength * Time.deltaTime), ForceMode.Impulse);// 设置开关为false,防止重复加力IsShot = false;}}else{// 如果保龄球的刚体组件不存在,输出调试信息Debug.Log("你的球已经没有了,怎么还在点");}}}
脚本概述
这个脚本名为 BaoLQManager
,主要负责控制保龄球的行为,包括:
-
将保龄球扔出去。
-
保龄球走直线把前面的柱子撞倒。
-
如果撞倒一个柱子就加一分。
-
如果撞到柱子后,间隔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轴,力的大小为ForceStrengthBaoLqRIGI.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
,防止重复加力。
-
-
如果保龄球的刚体组件不存在,输出调试信息。
-
总结
这个脚本的逻辑可以总结为以下几个步骤:
-
初始化:
-
在
Start
方法中,初始化IsShot
为true
,允许加力。
-
-
物理更新:
-
在
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",则分数加1Debug.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); // 销毁保龄球}}
}
详细注释:
-
变量声明:
-
YourScore
:一个整数变量,用于存储分数。
-
-
Start
方法:-
初始化
YourScore
为0
。
-
-
OnCollisionEnter
方法:-
当有物体碰撞到保龄球时调用此方法。
-
输出调试信息,表示有物体碰撞到了保龄球。
-
获取碰撞到的物体的名称。
-
检查碰撞到的物体是否是 "Road" 或 "Plane"。
-
如果是 "Road" 或 "Plane",输出调试信息,表示没有撞到有效的目标。
-
如果不是 "Road" 或 "Plane",则分数加1,并输出调试信息,显示当前分数和碰撞到的物体名称。
-
-
-
OnCollisionExit
方法:-
当保龄球离开一个碰撞器时调用此方法。
-
输出调试信息,表示保龄球离开了某个碰撞器。
-
检查离开的物体是否是 "Road"。
-
如果不是 "Road",则在2秒后销毁离开的物体。
-
如果是 "Road",则立即销毁保龄球,并输出调试信息,表示立即销毁保龄球。
-
-