unity3d 示例化gameObject的自写组件不工作

irlmq6kh  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(196)

我正在尝试在游戏中实现胸部机制。当玩家触摸胸部时,胸部消失,心脏出现。当玩家触摸示例化的心脏时,它必须消失,生命值加1,但脚本不起作用。
Chest.cs:

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

public class Chest : MonoBehaviour
{
    public GameObject heart;
    public GameObject _heart; //Instantiated heart.
    void OnTriggerEnter2D(Collider2D col){
        if (col.gameObject.tag == "Player"){
            Vector3 insPos = transform.position;
            _heart = Instantiate(heart,new Vector3(insPos.x,insPos.y+0.5f,insPos.z),Quaternion.identity);
            _heart.AddComponent<Heart>();
            _heart.GetComponent<Heart>().ls = GameObject.FindGameObjectWithTag("Player").GetComponent<LifeSystem>();
            Destroy(gameObject);
        }
    }
}

Heart.cs:

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

public class Heart : MonoBehaviour
{
    public LifeSystem ls;

    void OnTriggerEnter2D(Collider2D col){
        if (col.gameObject.tag == "Player"){
            SoundManager.PlaySound("CollectCoinSound");
            ls.lifes += 1;
            Destroy(gameObject);
        }
    }
}

当玩家触摸胸部时,我检查了示例化心脏的组件,我可以看到生命系统引用被添加,心脏脚本也被添加。
谢谢你的时间。

vyswwuz2

vyswwuz21#

要在派生的Hearth上调用OnTriggerEnter2D,您需要满足以下条件:

  1. PlayerHearth中至少有一个需要具有Rigidbody2D组件
  2. PlayerHearth都需要与IsTrigger = true具有碰撞器
  3. PlayerHearth游戏对象需要位于collision matrix中的两个交互层上
  4. Hearth组件需要与碰撞器位于同一游戏对象上,或者与RigidBody2D位于同一游戏对象上
    我实际上简化了规则1和规则2,以展示最常见的用例:如果你想知道碰撞的实际规则,你可以找到它们here(见底部的矩阵)。
zte4gxcn

zte4gxcn2#

除了general collision rules之外,我首先要确保您的字段具有正确的类型,并且已经将Heart组件附加到您的预置。
此外,也没有必要寻找。。你已经知道参考的球员,你是碰撞

public class Chest : MonoBehaviour
{
    public Heart heartPrefab;

    void OnTriggerEnter2D(Collider2D col)
    {
        if (col.CompareTag("Player"))
       {
            Instantiate(heart, transform.position + Vector3.up * 0.5f), Quaternion.identity);

            Destroy(gameObject);
        }
    }
}

然后简单地

public class Heart : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D col)
    {
        if (col.TryGetComponent<LifeSystem>(out var ls))
        {
            SoundManager.PlaySound("CollectCoinSound");
            ls.lifes += 1;
            Destroy(gameObject);
        }
    }
}

而是将LifeSystem附加到播放器对象。
总的来说,我会期待两者最终在同一时间触发,因为心脏可能已经触发,如果产卵的权利,球员是

相关问题