Как мне заставить свою самонаводящуюся ракету уничтожать вражеские цели?C#

Место общения программистов C#
Ответить
Anonymous
 Как мне заставить свою самонаводящуюся ракету уничтожать вражеские цели?

Сообщение Anonymous »

У меня все работает, когда дело доходит до отслеживания врага, единственное, что я не могу заставить работать, это самонаводящаяся ракета, уничтожающая врагов.
Загвоздка в том, что я хочу, чтобы самонаводящаяся ракета длилась определенное время, уничтожая нескольких врагов, а затем уничтожая себя по истечении времени.

Код: Выделить всё

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HomingMissle : MonoBehaviour
{
[SerializeField]
private float _speed = 5f;

[SerializeField]
public float _rotateSpeed = 200f;

private Transform _target;

private Rigidbody2D rb;

// Start is called before the first frame update
void Start()
{
Enemy _enemy = transform.GetComponent();

rb = GetComponent();

_target = GameObject.FindGameObjectWithTag("Enemy").transform;

transform.Translate(Vector3.up * _speed * Time.deltaTime);
}

// Update is called once per frame
void Update()
{
transform.Translate(Vector3.up * _speed * Time.deltaTime);

if(transform.position.y > 8)
{
Destroy(this.gameObject);
}
}

void FixedUpdate()
{
if (_target == null)
{
transform.Translate(Vector3.up * _speed * Time.deltaTime);
}
else
{
Vector2 direction = ((Vector2)_target.position - rb.position);

direction.Normalize();

float rotateAmount = Vector3.Cross(direction, transform.up).z;

rb.angularVelocity = -rotateAmount * _rotateSpeed;

rb.velocity = transform.up * _speed;
}
}

private void OnTriggerEnter2D(Collider2D other)
{
Debug.Log("Hit" + other.transform.name);

if (other.tag == "enemy")
{
Debug.Log("homing hit enemy");
}
}
}
Вот мой вражеский скрипт

Код: Выделить всё

[SerializeField]
private float _enemySpeed = 1f;

private float _kamikazeSpeed = 6f;

private Player _player;

// handle to animator component

private Animator _animate;

private AudioSource _explosionSX;

private float _fireRate = 1.0f;
private float _canFire = -1f;

private float _enemyFrequency = 1.0f;
private float _enemyAmplitude = 5.0f;
private float _enemycycleSpeed = 1.0f;
private float _enemyAggressive = 3.0f;

[SerializeField]
float _rayCastRad = 8.5f;
[SerializeField]
float _rayDistance = 8.0f;

private Vector3 _enemyPos;
private Vector3 _enemyAxis;

[SerializeField]
private GameObject _enemyLaser;

[SerializeField]
private GameObject _shieldVisualizer;

private bool _isenemyshieldActive = false;
private int _randomshieldedEnemies;
[SerializeField]
private SpriteRenderer _shieldRenderer;
private int _shieldStrengh = 1;

private bool _isLaserDetected;

// Start is called before the first frame update
void Start()
{
_player = GameObject.Find("Player").GetComponent
();
_explosionSX = GetComponent();
_enemyPos = transform.position;
_enemyAxis = transform.right;
_randomshieldedEnemies = Random.Range(0, 7);
_enemyAggressive = Random.Range(0, 5);

//null check player
if (_player == null)
{
Debug.LogError("The Player is NULL.");
}

//assign the component

_animate = GetComponent();

if (_animate == null)
{
Debug.LogError("The aninator is NULL");
}

_randomshieldedEnemies = Random.Range(0, 5);

if (_randomshieldedEnemies == 3)
{
ActiveShield();
}
}

// Update is called once per frame
void Update()
{
//move down at 4 meters per second

//if bottom of screen
//respawn at to with a new random x position

CalculateMovement();

if (Time.time >  _canFire)
{
_fireRate = Random.Range(1f, 3f);
_canFire = Time.time + _fireRate;
GameObject enemyFire = Instantiate(_enemyLaser, transform.position, Quaternion.identity);
Laser[] lasers = enemyFire.GetComponentsInChildren();
}
}

void CalculateMovement()
{

transform.Translate(Vector3.down * _enemySpeed * Time.deltaTime);
_enemySpeed = Random.Range(3f, 5f);

if (transform.position.y < -5f)
{
float randomX = Random.Range(-15f, 15f);

transform.position = new Vector3(randomX, 15, 0);
}

if (transform.position.x < 1)
{

_enemyPos += Vector3.down * Time.deltaTime * _enemycycleSpeed;
float randomX = Random.Range(-15f, 15f);
transform.position = _enemyPos + _enemyAxis * Mathf.Sin(Time.time * _enemyFrequency) * _enemyAmplitude;
_enemycycleSpeed = Random.Range(1f, 5.0f);
}

if (_player != null)
{
if (Vector3.Distance(transform.position, _player.transform.position) < _enemyAggressive)
{
KamikazePlayer();
}
}
}

public void ActiveShield()
{
_isenemyshieldActive = true;
_shieldVisualizer.SetActive(true);

}

private void KamikazePlayer()
{
if (transform.position.x < _player.transform.position.x)
{
transform.Translate(Vector3.right * _kamikazeSpeed * Time.deltaTime);
}
else if (transform.position.x > _player.transform.position.x)
{
transform.Translate(Vector3.left * _kamikazeSpeed * Time.deltaTime);
}
else if (transform.position.y > _player.transform.position.y)
{
transform.Translate(Vector3.down * _kamikazeSpeed * Time.deltaTime);
}
}

private void OnTriggerEnter2D(Collider2D other)
{
// if other is Player
//Destroy Us
//damage the player

if (other.gameObject.CompareTag("Player"))
{

//damage player
Player player = other.transform.GetComponent();

if (player != null)
{
player.Damage();
}

_animate.SetTrigger("OnEnemyDeath");
_enemySpeed = 0;
_explosionSX.Play();
Destroy(this.gameObject, 2.8f);

}

//if other is laser
//laser
//destroy us

if (other.gameObject.CompareTag("Laser"))
{
Destroy(other.gameObject);

if(_isenemyshieldActive)
{
_isenemyshieldActive = false;
_shieldVisualizer.SetActive(false);
return;
}

if (_player != null)
{
_player.AddScore(10);

}

_animate.SetTrigger("OnEnemyDeath");
Destroy(this.gameObject, 2.8f);
}
}

Подробнее здесь: https://stackoverflow.com/questions/783 ... my-targets
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»