У меня есть абстрактный класс:
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, однако этого не происходит при столкновении с наследником данного класса. Как же заставить бомбу взрываться при столкновении с игроком? Возможно, использовать теги?
Ты получаешь компонент типа 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
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Столкнулся со странной ошибкойЕсть кнопка button, и событие Click для неё
Возникла проблема, не могу подключить библиотеку к своему проектуВ ссылках проекта она не появляется