Unity-ML-Agents-Soccer Twos环境(2)-SoccerBallController.cs

官方链接:https://github.com/Unity-Technologies/ml-agents/blob/release_19/Project/Assets/ML-Agents/Examples/Soccer/Scripts/SoccerBallController.cs

目录

1. SoccerBallController.cs

1.1 导入命名空间

1.2 SoccerBallController类

1.3 Start()方法

1.4 OnCollisionEnter()函数

1.4.1 OnCollisionEnter()

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类的实例,用于控制整个足球场景。purpleGoalTagblueGoalTag是两个字符串变量,分别用于检测足球是否碰撞到紫色球门和蓝色球门。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是一个字符串变量,表示紫色球门的标签名。因此,整个语句的含义是:如果当前碰撞的游戏对象的标签名与紫色球门的标签名相同,则执行紫色球门被撞击的处理。

purpleGoalblueGoal 是场景中相应目标的标签名称,而 purpleGoalTagblueGoalTag 则是在代码中定义的字符串变量,用于存储这些标签名称。在 OnCollisionEnter 函数中,通过比较 col.gameObject 的标签名称purpleGoalTagblueGoalTag 的值,可以判断球是否触碰到了相应的目标。如果标签名称匹配,则调用 envController 中的 GoalTouched 函数,传入相应的团队(Team.BlueTeam.Purple)。

问:这里并没有给purpleGoalTag赋值?

这里的代码确实没有给purpleGoalTag赋值。可能是因为在Unity编辑器中设置了SoccerBallController组件的purpleGoalTag字段,从而在代码运行时可以使用它。在Unity中,有时候我们会把一些常量或者变量的值设置在组件上,方便开发和调试。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天寒心亦热

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值