【问题标题】:Unity tutorial - game object won't destroyUnity 教程 - 游戏对象不会破坏
【发布时间】:2020-02-16 21:06:48
【问题描述】:

我正在学习 Unity 中的 Udemy 2D 教程来创建 2D 像素游戏。语言是 C#。 在我的播放器脚本中,我有一个攻击功能,例如当我按下回车键时,一把剑从玩家的身体中飞出,沿着玩家正在看的方向(就像在旧的塞尔达游戏中一样)。为了让玩家在攻击时冻结一点,同时也限制剑的范围,我使用了第二个脚本,叫做剑,问题是我认为脚本根本没有被调用(我试过即使在 void start 中也可以进行一些调试,但什么也没有。

代码如下:

-这是我的攻击代码:

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.down * thrustPower);
    }
    else if (swordDir == 2)
    {
        newSword.transform.Rotate(0, 0, 90);
        newSword.GetComponent<Rigidbody2D>().AddForce(Vector2.left * thrustPower);
    }

    else if (swordDir == 3)
    {
        newSword.transform.Rotate(0, 0, -90);
        newSword.GetComponent<Rigidbody2D>().AddForce(Vector2.right * thrustPower);
    }
    #endregion

 }

这是我的 Sword 代码:我使用它主要是因为在进行攻击时 canMove 设置为 false,所以我必须在短时间内将其重置为 true 才能再次移动。

PS:我注意到剑脚本是直接在unity界面的scripts文件夹中创建的,乍一看并没有与任何游戏对象关联。

  {
public float timer;
// 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);          

    }

}

}

【问题讨论】:

  • PS2:我很自然地将Player标签设置为“Player”。
  • 那么您是否真的将脚本附加到游戏对象上?
  • 在教程中他没有这样做,当我尝试这样做并将脚本附加到剑精灵时,当我第一次攻击它时,玩家攻击,剑出现了,并且然后被破坏了,但是当我再次攻击时没有任何反应,剑不会再次出现
  • @DjamelMesbah 一般来说,不销毁和重生而是只启用和禁用剑会更有效,所以它可能不是最好的教程......在哪些脚本中方法以及这些脚本附加到什么?
  • 攻击方式在player Script中(有移动和血量显示,第二种(我们摧毁剑的地方)在Sword中,更准确地说,他对单击Scripts文件夹并直接添加ac#脚本并将其命名为Sword并放置该代码,而不将其附加到任何游戏对象。是的,你说的看起来更有效率和逻辑,我会尝试实现它,谢谢man

标签: c# unity3d


【解决方案1】:

您的预制件是否在实例化时附加了脚本?如果没有,你仍然需要 AddComponent() 就可以了。确保它在一个持有重要东西的父节点上,比如对撞机和网格,而不是一些较小的子节点,这样所有的东西都会被破坏。

看起来你没有给你的计时器一个值(浮动计时器;而不是浮动计时器 = 10f;)。所以当你实例化你的剑时,它会立即被摧毁。也许这就是你看不到它的原因?

离题 - 我建议不要在 Update() 中这样做:

    GameObject.FindGameObjectWithTag("Player").GetComponent<Player>().canMove = true;

而是考虑给玩家一个单例,或者至少在 Start() 处获得一次该引用。您正在搜索带有该标签的所有游戏对象,尝试每秒 60 次为游戏中的每把剑找到玩家,并且还要获取组件。如果你有充分的理由这样做,我想知道,但如果没有,请考虑改变它。如果您只是在尝试和享受乐趣,这没什么大不了的,但在某些时候仍然可能需要考虑一些事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多