OnCollisionEnter2D для наследника

95
06 февраля 2021, 05:30

У меня есть абстрактный класс:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class Tank : MonoBehaviour
{
   public float HP;    // здоровье
   public float moveSpeed; // скорость движения
   public float rotateSpeed;   // скорость поворота
   public void MoveForward(float weakness)
   {
       transform.position += transform.up * moveSpeed * weakness;
   }
   public void MoveBack()
   {
       transform.position -= transform.up * moveSpeed;
   }
   public void MoveRight()
   {
    float angle = transform.rotation.z;
    transform.Rotate(0f, 0f, -rotateSpeed, Space.World);
   }
   public void MoveLeft()  
   {
       float angle = transform.rotation.z;
       transform.Rotate(0f, 0f, rotateSpeed, Space.World);
   }
   public void TakingDamage(float damage)
   {
       HP -= damage;
   }

}

И класс мины:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bomb : MonoBehaviour
{
    public float damage;
    private void OnCollisionEnter2D(Collision2D collision)
    {
        Tank tank = collision.gameObject.GetComponent<Tank>();
        tank.TakingDamage(damage);
        Destroy(gameObject);
    }
}

Если я правильно понял - бомба взрывается только при столкновении с членом класса Tank, однако этого не происходит при столкновении с наследником данного класса. Как же заставить бомбу взрываться при столкновении с игроком? Возможно, использовать теги?

Answer 1

Ты получаешь компонент типа Tank Если столкновение мины произошло с каким-то другим объектом у тебя переменная tank равна null. Тебе как минимум нужно делать проверку на это.

И при этом, если у класса Tank есть наследники, то эти классы всё равно отличаются и не есть класс Tank.

Так что тебе придётся получать компонент столкновения для каждого объекта с которым мина может столкнуться, и не важно наследуются их классы каким-либо образом или нет.

Почему? потому что при столкновении, скажем класса Player который к примеру наследует класс Tank. Столкновение всё равно происходит от имени класса Player.

И код должен будет выглядеть примерно так:

private void OnCollisionEnter2D(Collision2D collision)
{
    Tank tank = collision.gameObject.GetComponent<Tank>();
    Player player  = collision.gameObject.GetComponent<Player>();
    if(tank != null) {
        tank.TakingDamage(damage);
        Destroy(gameObject);
    }
    if(player != null) {
        //TODO: player's behaviour
    }
}
READ ALSO
Входная строка имела неверный формат в Int32.Parse

Входная строка имела неверный формат в Int32.Parse

Столкнулся со странной ошибкойЕсть кнопка button, и событие Click для неё

131
Создать XML для Excel с помощью LINQ to XML

Создать XML для Excel с помощью LINQ to XML

Пытаюсь построить XML для Excel такого вида:

119
не отображается библиотека к проекту C#

не отображается библиотека к проекту C#

Возникла проблема, не могу подключить библиотеку к своему проектуВ ссылках проекта она не появляется

92