Unity(c#) - Как заспавнить объект , чтоб он летел и уничтожал другой?
У меня возникла проблема. В моей игре есть объект (Ракета) которая падает вниз. Когда игрок подобрал эту Ракету она должна вылетать с того положения где находится игрок и уничтожать другой объект (Бомба). К сожалению у меня выбивает ошибку. ***** - Это Код Полёта ***** `{
[SerializeField]
private float fallSpeed = 3f; // Скорость падения объекта
void Update()
{
if (transform.position.y < -6f){
Destroy(gameObject); }
transform.position -= new Vector3(0, fallSpeed * Time.deltaTime, 0);
}
}`
*****- Когда происходит действие- *****
if (other.tag == "Rocket")
{
Destroy(other.gameObject);
StartCoroutine(RocketShot());
StopCoroutine(RocketShot());
}
}
private IEnumerator RocketShot()
{
rocket = true;
yield return new WaitForSeconds(10f);
rocket = false;
}
****- Мой Код Спавна - *****
private float _shotSpeed = 5f;
private Transform _player;
private Transform _bombPoint;
[SerializeField]
private GameObject _rocketObject;
private float _spawnTime = 3f;
void Start()
{
_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
_bombPoint = GameObject.FindGameObjectWithTag("Bomb").GetComponent<Transform>();
InvokeRepeating("Update", 0, _spawnTime);
}
void Update()
{
if (Player.rocket)
{
GameObject RocketPrefab = Instantiate( _rocketObject, _player.position, Quaternion.identity);
transform.position = Vector3.MoveTowards(_player.position, _bombPoint.position, _shotSpeed);
}
}
}
Ответы (1 шт):
Автор решения: Yaroslav
→ Ссылка
[DisallowMultipleComponent]
public class Player : MonoBehaviour {
[SerializeField] [Tooltip("Require component \"Roket\"")] private GameObject _roketPrefub;
SerializeField] _attackSpeed = 3f;
private bool _attacking;
Private float _attackTimer;
private void OnValidate () {
if (_roketPrefub != null && _roketPrefub.GetComponent<Roket>() == null) {
_roketPrefub = null;
Debug.LogError("\"Roket Prefub\" not contain \"Roket\" component");
}
}
private void Start () {
_attackTimer = _attackSpeed;
_attacking = true;
}
private void Update () {
_attackSpeed += Time.deltaTime;
if (_attacking && _attackSpeed > _attackSpeed) {
_attackSpeed = 0;
LaunchRoket(Bomb.transform);
}
}
private void LaunchRoket (Transform target) {
if (_roketPrefub != null) {
GameObject NewRoket = Instantiate(_roketPrefub);
Roket Roket = NewRoket.GetComponent<Roket>();
Roket.Lounch(transform, target);
}
}
}
-
[DisallowMultipleComponent]
public class Roket : MonoBehaviour {
[SerializeField] private float _speed = 5f;
[SerializeField] private float _detonationRange = 0.5f;
private Transform _transform;
private Transform _target;
private bool _lounched;
public void Lounch (Transform player, Transform target) {
_transform = transform;
_target = target;
_lounched = true;
_transform.position = player.position
}
private void Detonation () {
if (_target != null)
_target.gameObject.AddComponent<Fall>();
Destroy(gameObject);
}
private void Update () {
if (_lounched) {
if (_target != null) {
_transform.position = Vector3.MoveTowards(_transform.position, _target.position, _speed*Time.deltaTime);
_transform.LookAt(_target.position);
if (Vector3.Distance(_transform.position, _target.position) < _detonationRange)
Detonation();
} else
Detonation();
}
}
}
-
[DisallowMultipleComponent] // !!!
public class Fall : MonoBehaviour {
private float _speed = -3f;
private float _destroyY = -6f;
private Transform _transform;
private void Start () {
_transform = transform;
}
void Update () {
_transform.position += new Vector3(0, _speed, 0)*Time.deltaTime;
if (_transform.position.y < _destroyY)
Destroy(gameObject);
}
}