Anonymous
Как мне заставить свою самонаводящуюся ракету уничтожать вражеские цели?
Сообщение
Anonymous » 10 ноя 2025, 18:35
У меня все работает, когда дело доходит до отслеживания врага, единственное, что я не могу заставить работать, это самонаводящаяся ракета, уничтожающая врагов.
Загвоздка в том, что я хочу, чтобы самонаводящаяся ракета длилась определенное время, уничтожая нескольких врагов, а затем уничтожая себя по истечении времени.
Код: Выделить всё
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
1762788943
Anonymous
У меня все работает, когда дело доходит до отслеживания врага, единственное, что я не могу заставить работать, это самонаводящаяся ракета, уничтожающая врагов. Загвоздка в том, что я хочу, чтобы самонаводящаяся ракета длилась определенное время, уничтожая нескольких врагов, а затем уничтожая себя по истечении времени. [code]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"); } } } [/code] Вот мой вражеский скрипт [code][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); } } [/code] Подробнее здесь: [url]https://stackoverflow.com/questions/78314482/how-do-i-get-my-homing-missile-to-destroy-enemy-targets[/url]