unity3d 无法从脚本冻结球员轮换

pkmbmrz7  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(156)

我试图解冻我的球员轮换,然后再次冻结它。它解冻,但由于某些原因,我不能再次冻结轮换。
游戏管理器脚本-

public void enableRotation()
    {
        if (CompareTag("Player"))
        {
            rb.freezeRotation = true;
        }

    }

传单_脚本外-

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class flyer_Off : MonoBehaviour
{
    void OnTriggerEnter(Collider other)
    {
        FindObjectOfType<GameManager>().enableRotation();
    }

}

我能够以相同的方式解冻旋转,但由于某种原因,当我尝试再次冻结它时,它不起作用。
我试着将GameManager脚本添加到Player和flyer_Off中,并在触发器和Player上添加Box Collider。
如果需要更多信息,我可以添加。
谢谢你

sy5wg1nm

sy5wg1nm1#

既然你想冻结旋转,它应该可以工作。唯一的例外是根本没有到达那一行。请检查你的对象是否有标签“球员”,并确实有一个“游戏经理”组件在它上面。
将freeze值设置为true rb.freezeRotation = true;只会冻结它。我会将该函数重命名为“toggleRotation”,并执行以下操作:rb.freezeRotation = !rb.freezeRotation;

ffscu2ro

ffscu2ro2#

您应该使用Collider other访问播放器。

void OnTriggerEnter(Collider other)
{
    if (CompareTag("Player"))
    {
        RigidBody rb = other.gameObject.GetComponent<RigidBody>();
        rb.freezeRotation = true;
    }
}

正如derHugo所说。你的GameManager可能不应该有你的玩家的RigidBody。玩家要对自己的RigidBody负责。

请考虑:

[RequiredComponent(typeof(RigidBody))]
public class Player : MonoBehaviour
{

    public void EnableRotation()
    {
        
        RigidBody rb = gameObject.GetComponent<RigidBody>();
        rb.freezeRotation = true;
        
    }

}

public class flyer_Off : MonoBehaviour
{

    void OnTriggerEnter(Collider other)
    {

        // if other.gameObject does not contain a component Player, it returns null
        Player player = other.GetComponent<Player>();
        if(player)
        {

             player.EnableRotation();

        }

    }

}

有一个名为EnableRotation的成员函数,然后在该函数中冻结旋转,并不能使代码更容易维护。

相关问题