我的if语句Function根本不起作用

问题描述

我只是通过这段视频制作2D空间射击游戏。 (https://www.youtube.com/watch?v=2mNXfrh0UYo&t=2720s)我编写了一个脚本,当敌人的弹丸与玩家飞船相撞时,通过研究玩家的标签来摧毁玩家的飞船,但是当我运行游戏时,玩家的飞船根本不会被摧毁。 (我已经检查了Player的太空船上的标签,但是已经将Player的标签放到Player的太空船上。)我尝试将Debug.Log放在OnCollisionEnter2D方法中,以查找错误的地方,但是当我尝试运行游戏时,我发现Player的所有OnCollisionEnter函数功能均不起作用(我还尝试将BoxCollider2D放在每个预制件上,然后打开“是触发器”来解决此问题,但这不是正确的解决方案)。从这些事情来看,我遇到的问题可以说是我的代码中的if语句和研究标签功能根本无法正常工作。是否还有任何可能的问题以及解决该问题的方法

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

public class EnemyProjectile : MonoBehavIoUr
{
    public GameObject Projectile_Enemy;
    public float speed;

    // Start is called before the first frame update
    void Start() 
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(new Vector3(0,-1 * speed * Time.deltaTime,0));
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Player")
        {
            Destroy(collision.gameObject); // Problem Is here,this if statements doesn't work at all.
            Debug.Log("test");
            Destroy(Projectile_Enemy);
            Debug.Log("Test");
        }
        if (collision.gameObject.tag == "Wall")
        {
            Destroy(Projectile_Enemy);
            Debug.Log("TEST");
        }
    }
}

我使用的Unity版本是Unity 2019 3 14,我通过Microsoft Visual Studio编辑代码

[1][Hierarchy] [1]: https://i.stack.imgur.com/c43uR.png

解决方法

尝试改用OnTriggerEnter方法

void OnTriggerEnter(Collider col)
 {
 Destroy(col.gameObject);
 }

 void OnTriggerEnter()
 {
 Destroy(gameObject);
 }
,

我假设将.tag键入为Object,而不是String-在这种情况下,您使用的是不可覆盖的==运算符,与Object.ReferenceEquals,这就是为什么它不起作用的原因。

您有两个选择:

  1. 确保为每个字符串值使用一个static readonly String实例,以确保引用相等将起作用(不要使用const String,因为这不能保证引用相等)。

  2. .tag投射到String,然后使用==String.Equals

选项1:

public static class KnownTags
{
    public static readonly String Player = nameof(Player);
    public static readonly String Wall   = nameof(Wall);
}

public class EnemyProjectile : MonoBehaviour
{
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == KnownTags.Player)
        {

选项2:

    private void OnCollisionEnter2D(Collision2D collision)
    {
        String tag = collision.gameObject.tag as String;
        if( tag == null ) return;

        if ("Player".Equals(tag))
        {
            
        }
        else if ("Wall".Equals(tag))
        {
            
        }
    }