【问题标题】:My if statement Functions doesn't work at all我的 if 语句函数根本不起作用
【发布时间】:2020-09-06 03:12:24
【问题描述】:

我只是根据这个视频制作 2d 太空射击游戏。 (https://www.youtube.com/watch?v=2mNXfrh0UYo&t=2720s)我做了一个脚本,当敌人的弹丸与玩家飞船相撞时,通过研究玩家的标签来摧毁玩家的飞船,但是当我运行游戏时,玩家的飞船根本没有摧毁。 (我已经检查了玩家飞船上的标签,但是我已经在玩家飞船上放置了玩家标签。)我尝试将 Debug.Log 放在 OnCollisionEnter2D 方法中以查找错误的地方,但是当我尝试运行游戏时,我发现Player 的所有 OnCollisionEnter 函数的功能都不起作用(我也尝试将 BoxCollider2D 放在每个预制件上并打开“Is Trigger”来解决这个问题,但这不是正确的解决方案)。从这些事情来看,我遇到的问题可以说是我的代码中的 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

【问题讨论】:

  • 贴一张你的层次结构的图片,检查你的模型是否有刚体组件

标签: c# visual-studio unity3d if-statement tags


【解决方案1】:

我假设.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))
        {
            
        }
    }

【讨论】:

    【解决方案2】:

    尝试改用 OnTriggerEnter 方法

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

    【讨论】:

    • 对不起,我的理解不够,但是我把这些代码放到了哪里?
    猜你喜欢
    • 2023-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2014-03-21
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多