【问题标题】:Unity tutorial- Gameobject won't destroyUnity 教程 - Gameobject 不会破坏
【发布时间】:2020-03-08 17:02:53
【问题描述】:

我正在学习 Unity 中的 Udemy 2D 教程来创建 2D 像素游戏。语言是 C#。我只是复制代码,因为我不熟悉编码,但是我将代码复制到 T 并且我的一个 GameObjects 出现问题。目标是每次启动我的剑游戏对象时都销毁它,否则我的层次结构中会出现一堆副本。副本不会自我毁灭。 如果我没看错,我可能不是因为我不是程序员,这源于另一段代码,说明角色在剑启动时无法移动,但是此复选框不会切换回 canMove=真的,让角色卡在原地。当 canMove = false 时,Sword 游戏对象不会破坏。用我的代码可能更容易解释。

这是我的 Player canMove 代码:

void Attack()
    {
        canMove = false;
        GameObject newSword = Instantiate(sword, transform.position, sword.transform.rotation);
        #region //SwordRotation
        int swordDir = anim.GetInteger("dir");
        if(swordDir == 0) 
    {
            newSword.transform.Rotate(0, 0, 0);
            newSword.GetComponent<Rigidbody2D>().AddForce(Vector2.up * thrustPower);
    }
        else if (swordDir == 1)
    {
            newSword.transform.Rotate(0, 0, 180);
            newSword.GetComponent<Rigidbody2D>().AddForce(Vector2.up * -thrustPower);
    }
        else if (swordDir == 2)
    {
            newSword.transform.Rotate(0, 0, 90);
            newSword.GetComponent<Rigidbody2D>().AddForce(Vector2.right * -thrustPower);
    }
        else if (swordDir == 3)
    {
            newSword.transform.Rotate(0, 0, -90);
            newSword.GetComponent<Rigidbody2D>().AddForce(Vector2.right * thrustPower);
    }
        #endregion


    }

    void Movement()
    {
        if (!canMove)
            return;
        if (Input.GetKey(KeyCode.W))
        { transform.Translate(0, speed * Time.deltaTime, 0); anim.SetInteger("dir", 0); anim.speed = 1; }
        else if (Input.GetKey(KeyCode.S))
        { transform.Translate(0, -speed * Time.deltaTime, 0); anim.SetInteger("dir", 1); anim.speed = 1; }
        else if (Input.GetKey(KeyCode.A))
        { transform.Translate(-speed * Time.deltaTime, 0, 0); anim.SetInteger("dir", 2); anim.speed = 1; }
        else if (Input.GetKey(KeyCode.D))
        { transform.Translate(speed * Time.deltaTime, 0, 0); anim.SetInteger("dir", 3); anim.speed = 1; }
        else
            anim.speed = 0;
    }

还有我的剑码:

public class Sword : MonoBehaviour
{
    float timer = .15f;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        timer -= Time.deltaTime;
    if (timer <= 0)
    {
        GameObject.FindGameObjectWithTag("Player").GetComponent<Player>().canMove = true;
        Destroy(gameObject);
    }
    }
}

【问题讨论】:

  • 你的剑启用/激活了吗?它在层次结构中是灰色的吗?
  • @ErikOverflow 是的,它已启用且未变灰

标签: c# unity3d destroy


【解决方案1】:

Destroy(gameObject); 在你的剑代码中。改成Destroy(this.gameObject);

剑现在不见了。

【讨论】:

  • this 无关紧要。任何代码的上下文已经是this,并且this.gameObject 和gameObject 都指的是同一个东西(除非a local variable gets involved)。
【解决方案2】:

我在我的环境中检查了 Sword 代码,计时器似乎工作正常。 如果有的话,请检查 Player 对象是否具有分配给它的标签“Player”。如果无法找到所需的对象,代码可能会停在那里。

可以在检查器中找到分配标签的位置,在 标签 选项旁边的下拉菜单下。

如果您已经这样做了,请检查是否有任何其他对象分配了“玩家”标签。 FindGameObjectWithTag 只会查找 1 个对象,这可能不是您要查找的对象。 如果有疑问,请将这些行放在代码中的某处:

GameObject player = GameObject.FindGameObjectWithTag("Player");
Debug.Log(player.name);

这应该会返回您尝试查找的对象的名称。 如果返回为 null,则无法找到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 2014-01-11
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多