问题描述
我只是通过这段视频制作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
,这就是为什么它不起作用的原因。
您有两个选择:
-
确保为每个字符串值使用一个
static readonly String
实例,以确保引用相等将起作用(不要使用const String
,因为这不能保证引用相等)。 -
将
.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))
{
}
}