目录
1.4.2 col.gameObject.CompareTag(purpleGoalTag)
1. SoccerBallController.cs
using UnityEngine;
public class SoccerBallController : MonoBehaviour
{
public GameObject area; //场景中的Soccer场地对象
[HideInInspector]
public SoccerEnvController envController; //Soccer场地的控制器
public string purpleGoalTag; //用于检查球是否碰到紫色球门的标签
public string blueGoalTag; //用于检查球是否碰到蓝色球门的标签
void Start()
{
envController = area.GetComponent<SoccerEnvController>(); //获取场地控制器
}
void OnCollisionEnter(Collision col)
{
if (col.gameObject.CompareTag(purpleGoalTag)) //球碰到了紫色球门
{
envController.GoalTouched(Team.Blue); //通知场地控制器紫队失球了
}
if (col.gameObject.CompareTag(blueGoalTag)) //球碰到了蓝色球门
{
envController.GoalTouched(Team.Purple); //通知场地控制器蓝队失球了
}
}
}
这段代码是 SoccerBall(足球)对象的控制脚本,主要实现了当足球与球门碰撞时触发事件,通过与球门对象的 Tag 进行比较,判断足球进球的队伍,并将进球信息传递给足球所在的环境(SoccerEnvController)。具体来说:
- area:足球所在的环境对象;
- envController:环境控制器,即 SoccerEnvController,通过这个变量可以调用环境控制器中定义的方法;
- purpleGoalTag:球门对象的 Tag,用于判断足球是否碰到紫队的球门;
- blueGoalTag:球门对象的 Tag,用于判断足球是否碰到蓝队的球门;
- OnCollisionEnter(Collision col):当足球对象与其他对象发生碰撞时,会触发该事件,其中 col 参数表示碰撞的对象信息;
- CompareTag(string tag):判断碰撞的对象是否具有指定的 Tag;
- GoalTouched(Team team):当足球进球时,通过调用 SoccerEnvController 中的 GoalTouched 方法,将进球信息传递给环境控制器。
1.1 导入命名空间
using UnityEngine;
这行代码是Unity中用于引入Unity引擎API的命名空间。所有Unity API中的类和函数都在这个命名空间中定义。这个命名空间包括了游戏对象、材质、声音、碰撞器、游戏状态等许多常用的Unity组件和功能。
1.2 SoccerBallController类
public GameObject area;
[HideInInspector]
public SoccerEnvController envController;
public string purpleGoalTag; //will be used to check if collided with purple goal
public string blueGoalTag; //will be used to check if collided with blue goal
这段代码定义了一个名为SoccerBallController的类,包含以下成员:
①public GameObject area;
:表示场地的GameObject对象。
②[HideInInspector] public SoccerEnvController envController;
:表示足球的环境控制器,它是一个SoccerEnvController类型的公共成员变量,用[HideInInspector]来隐藏它。
③public string purpleGoalTag;
:表示进入紫色球门的标记。这是一个公共字符串类型的成员变量,将在后面用于检查足球是否进入了紫色球门。
④public string blueGoalTag;
:表示进入蓝色球门的标记。同样是一个公共字符串类型的成员变量,将在后面用于检查足球是否进入了蓝色球门。
1.3 Start()方法
void Start()
{
envController = area.GetComponent<SoccerEnvController>();
}
这个 Start()
方法是 SoccerBallController
脚本在被实例化时自动执行的方法。在这个方法中,envController
变量被设置为与此脚本实例相关联的 area
游戏对象上的 SoccerEnvController
组件。也就是说,envController
变量将会引用场景中的 SoccerEnvController
组件,从而使 SoccerBallController
脚本能够与场景中的其他对象进行通信和交互。
1.4 OnCollisionEnter()函数
// 当球体碰撞到其他对象时被调用
void OnCollisionEnter(Collision col)
{
if (col.gameObject.CompareTag(purpleGoalTag)) // 球撞到紫色球门
{
envController.GoalTouched(Team.Blue);
}
if (col.gameObject.CompareTag(blueGoalTag)) // 球撞到蓝色球门
{
envController.GoalTouched(Team.Purple);
}
}
这段代码实现了足球游戏中足球与球门的碰撞检测。当足球碰到紫色球门时,会调用envController
对象的GoalTouched
方法并传入Team.Blue
作为参数;当足球碰到蓝色球门时,会调用envController
对象的GoalTouched
方法并传入Team.Purple
作为参数。
其中envController
对象是SoccerEnvController
类的实例,用于控制整个足球场景。purpleGoalTag
和blueGoalTag
是两个字符串变量,分别用于检测足球是否碰撞到紫色球门和蓝色球门。CompareTag
方法用于比较游戏对象的标签是否与指定标签相同。
1.4.1 OnCollisionEnter()
OnCollisionEnter()
是一个在具有碰撞体的两个游戏对象之间发生碰撞时调用的函数。只需要在具有碰撞体的游戏对象中的其中一个添加该函数即可,当另一个游戏对象与其发生碰撞时,该函数会自动调用。当游戏对象 A 和游戏对象 B 碰撞时,如果游戏对象 A 上有附加了 OnCollisionEnter()
函数的脚本组件,Unity 引擎会自动调用这个函数,并将碰撞信息以参数的形式传递进来,这样脚本组件就可以根据碰撞信息做出相应的响应和处理。在函数中可以通过 col
参数来访问碰撞信息,如碰撞点、碰撞体、碰撞速度等。
1.4.2 col.gameObject.CompareTag(purpleGoalTag)
col.gameObject.CompareTag(purpleGoalTag)
在Unity中,每个游戏对象(GameObject)都可以添加一个或多个标签(Tag),用于区分不同的游戏对象。
在上面的代码中,使用了col.gameObject.CompareTag(purpleGoalTag)
语句来判断当前与球发生碰撞的游戏对象是否与紫色球门的标签一致。如果一致,则说明球已经撞到了紫色球门。
col.gameObject
表示与球碰撞的游戏对象,.CompareTag()
是一个比较标签是否相同的方法,参数purpleGoalTag
是一个字符串变量,表示紫色球门的标签名。因此,整个语句的含义是:如果当前碰撞的游戏对象的标签名与紫色球门的标签名相同,则执行紫色球门被撞击的处理。
purpleGoal
和 blueGoal
是场景中相应目标的标签名称,而 purpleGoalTag
和 blueGoalTag
则是在代码中定义的字符串变量,用于存储这些标签名称。在 OnCollisionEnter
函数中,通过比较 col.gameObject
的标签名称和 purpleGoalTag
或 blueGoalTag
的值,可以判断球是否触碰到了相应的目标。如果标签名称匹配,则调用 envController
中的 GoalTouched
函数,传入相应的团队(Team.Blue
或 Team.Purple
)。
问:这里并没有给purpleGoalTag赋值?
这里的代码确实没有给purpleGoalTag
赋值。可能是因为在Unity编辑器中设置了SoccerBallController
组件的purpleGoalTag
字段,从而在代码运行时可以使用它。在Unity中,有时候我们会把一些常量或者变量的值设置在组件上,方便开发和调试。