【问题标题】:Checking collision from external script in Unity在 Unity 中检查外部脚本的碰撞
【发布时间】:2017-07-14 07:14:33
【问题描述】:

我有以下脚本应该检测两个对象之间的碰撞(BoxCollider2D 是触发器,CircleCollider2D 是普通碰撞器)

public class ArcadeScore : MonoBehaviour {

    public BoxCollider2D bc;
    public CircleCollider2D cc;

    private int score;

    // Use this for initialization
    void Start () {
        score = 0;
    }

    // Update is called once per frame
    void Update ()
    {
        if (bc.IsTouching(cc))
        {
            Debug.Log("collision detected");
            score++;
        }
    }
}

但是脚本没有在控制台打印任何东西,所以我想知道是否可以从外部脚本中检测到触发器和普通碰撞器之间的碰撞?

【问题讨论】:

  • “外部脚本”.....这到底是什么意思?
  • @Programmer 要添加一个空的游戏对象,请附加一个脚本并使用它来检测碰撞
  • @Programmer 我也尝试过使用 OnTriggerEnter2D() 并制作一个公共 Collider2D 并将我的触发器附加到那里,但仍然没有。
  • 简单的叫做“脚本”。你检查过对撞机上的“是触发器”吗?
  • @Programmer 是的,我做到了

标签: c# unity3d collision-detection game-engine


【解决方案1】:

你必须使用OnCollisionEnter2D 而不是 IsTouching。 IsTouching 用于检测他们何时触摸帧,这可能不是真的。 T带有OnCollisionEnter2D 函数的脚本必须附加到游戏对象,而碰撞器不能附加到空游戏对象。

问题是我不断地破坏那个对象和所有的 值恢复为 0

您必须将游戏逻辑、系统代码与运行时破坏的对象分开。基本上,你的游戏逻辑、评分系统代码不应该附加到破坏自身的对象上。它们应该附加到一个空的 GameObject。

诀窍是找到分数系统对象,获取其脚本,然后在销毁碰撞对象之前更新分数。

ScoreSystem 脚本(附加到一个空的游戏对象):

public class ArcadeScore : MonoBehaviour 
{
    public int score;

    // Use this for initialization
    void Start () {
        score = 0;
    }
}

碰撞脚本(使用碰撞器附加到游戏对象):

public class CollsionScript: MonoBehaviour 
{
    ArcadeScore scoreSys;

    void Start()
    {
        //Find the ScoreSystem GameObject
        GameObject obj = GameObject.Find("ScoreSystem");
        //Get the ArcadeScore script
        scoreSys = obj.GetComponent<ArcadeScore >();
    }

    void OnCollisionEnter2D(Collision2D coll) 
    {
        if (coll.gameObject.tag == "YourOtherObject")
        {
            scoreSys.score++;
            //You can now destroy object
            Destroy(gameObject);
        }
    }
}

【讨论】:

  • 还有一个问题,每当我尝试存储最新分数并在下一个场景中显示时,我总是得到0。我在ArcadeScore类中使用了这个,svScore = PlayerPrefs.GetInt(score.ToString( ));.所以我认为这将始终存储最新值,因为我在 Update() 中使用它
  • 错了。您使用密钥存储并使用密钥检索。让我们使用 "John" 作为此示例的键。存储:PlayerPrefs.SetInt("John",score); PlayerPrefs.Save(); 然后检索约翰密钥:score = PlayerPrefs.GetInt("John");
  • 为什么在我切换场景时总是将值恢复为 0。我 Debug.Log 分数,一切看起来都很好,但是当我切换时分数为 0,虽然我保存了它
  • 因为一切都在重新加载,这会恢复到它们的默认值。您负责在切换场景之前保存它并在切换场景后将其加载回来。
  • 我会努力做到的。非常感谢你帮助我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多