【问题标题】:Can anyone tell me why my triggers are not working the way I intended them to?谁能告诉我为什么我的触发器没有按照我的预期工作?
【发布时间】:2020-06-20 10:58:06
【问题描述】:

我目前的游戏一直有这个问题。

问题是,当我的玩家(火箭)与小行星(敌人)相撞时,玩家注定要死去并重新开始关卡,但即使我已经将我的玩家放在没有触发器的盒子对撞机上,这也不起作用还有我的带触发器和圆形对撞机的小行星。我也尝试过让小行星带触发器,玩家不​​带触发器,两者都带触发器,但我的火箭每次都穿过小行星。控制台窗口中没有错误。下面是我为此使用的代码。更新:我使用了每个人的建议并整理了代码回顾我应该看到将“OnTriggerEnter”放在更新方法中是行不通的,但无论如何火箭和小行星都上面有一个“Rigibody”组件,当玩家与小行星碰撞时,他会消失并且不会重新启动,我已经开始编写重生点,但出现的错误是“错误 CS1955:不可调用成员'Transform.position ' 不能像方法一样使用。”这是更新后的代码。

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

public class Movement : MonoBehaviour
{

    public float speed = 6.0f;
    public GameObject character;

    private Animator anim;
    private Vector3 Respawnpoint; 



    private void OnCollisionEnter2D(Collision2D collision)
    {
        switch (collision.gameObject.tag)
        {
            case "Enemy":
                Destroy(gameObject);
                break;
            default:
                //nothing
                break;     

        }
    }

    void Start()
    {
        anim = GetComponent<Animator>();
        Respawnpoint = transform.position();
    }


    void Update()
    {
        

        if (Input.anyKey)
        {
            transform.Translate(Vector3.forward * Time.deltaTime * speed);
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            transform.position += Vector3.right * speed * Time.deltaTime;
            anim.SetBool("Isright", true);
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            transform.position += Vector3.left * speed * Time.deltaTime;
            anim.SetBool("Isleft", true);
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.position += Vector3.right * speed * Time.deltaTime;
            anim.SetBool("Isright", true);
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.position += Vector3.left * speed * Time.deltaTime;
            anim.SetBool("Isleft", true);
        }
        else
        {

        }
        
    }
}

【问题讨论】:

  • 您的至少一个碰撞对象上是否有RigidBodyOnTriggerEnter 并且排序仅在至少存在一个时才有效。
  • 还有。我刚刚阅读了您的代码,我不敢相信没有错误消息。您将两个函数相互嵌套。那肯定行不通!

标签: c# unity3d


【解决方案1】:

正如其他人指出的那样,代码结构不正确。

在您的更新中,您有触发方法。结果它永远不会被调用

您只需删除 void update() 的 2 行及其后面的左括号即可​​。以及该方法的最后一个右括号,因此触发器方法在类中是独立的。

假设您有一个 Rigidbody2D 并设置了触发器,它应该可以工作。

我还建议代码有改进的余地,但不是挑剔,而是让我们解决主要问题

【讨论】:

  • 好的,感谢您的反馈。我是来学习的,所以如果有更多批评,请告诉我,因为我想改进:)
  • 好吧。如果您销毁游戏对象,则不必担心移动它。移动它的代码可能应该在更新或固定更新中。还是您真的只想在接触时进行编码?
  • 当玩家与小行星交互时,我只想让它重新启动。小行星将来会移动,但目前我只想让玩家在小行星被击中时重新启动。
【解决方案2】:

您将 void OnTriggerEnter2D (Collider2D other) 放入更新中。你写对了吗?

【讨论】:

    【解决方案3】:

    我认为您的代码中的问题是您的条件gameObject.tag 有点错误。我建议将其更改为collision.gameObject.tag。另外,我认为最好将 void OnTriggerEnter2D (Collider2D other) 放在void Update() 之外。如果此解决方案有效,请回复。 更新:你可以这样写:

     using UnityEngine.SceneManagement;
     ...
     private void OnCollisionEnter2D(Collision2D collision)
    {
     int sceneIndex = SceneManager.GetActiveScene().buildIndex;
        switch (collision.gameObject.tag)
        {
            case "Enemy":
            Destroy(gameObject);
           SceneManager.LoadScene(sceneIndex);
                break;
            default:
                //nothing
                break;
        }
    }
    

    我建议您使用OnCollisionEnter2D 而不是OnTriggerEnter2D,因为触发器通常是您可以通过的不可见对象。

    【讨论】:

    • 如果您不希望小行星偏离其路线,那么触发器是正确的。
    • 取决于它是否摧毁了它,你可能希望它继续走上赢家的道路
    • 我更新了代码,它可以工作,但唯一的问题是播放器没有重生。
    • 如果你想让玩家重生,你必须添加一些额外的代码。我建议你只加载再次播放的关卡。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多