LineRenderer на секунду спавнится не в том месте [Unity 2D]
Есть небольшой опыт в программировании, но много чего не знаю
В моём проекте при нажатии на кнопку персонаж стреляет лучами и наносит врагам урон. Урон наносится одновременно всем врагам на определённой дистанции, лучи выполняют чисто косметическую функцию. При нажатии на кнопку считываются все враги в радиусе атаки, им наносится урон, в этот же момент спавнится префаб с компонентом LineRenderer, скрипт просчитывает, где находятся враги, и проводит лучи от ShotPoint'а игрока во врагов. Игрок может ходить по карте и, собственно, стрелять с любого места на карте. Всё работает отлично, но заметил проблему: при нажатии кнопки атаки вместе со всеми лучами появляется какой-то левый луч, который идёт от игрока в нулевые координаты (или от нулевых координат в игрока, не знаю). Он появляется буквально на полсекунды, но это очень некрасиво выглядит во время игры. Скрипт самого луча, Shocker:
private LineRenderer lr;
private Transform target;
private void Awake()
{
lr = GetComponent<LineRenderer>();
}
public void AssignTarget(Vector3 startPos, Transform newTarget)
{
lr.positionCount = 2;
lr.SetPosition(0, startPos);
target = newTarget;
}
private void Update()
{
lr.SetPosition(1, target.position);
}
Скрипт пушки, которая спавнит префаб луча:
public List<EnemyHealth> enemies;
private List<Shocker> allLines;
public Shocker linePrefab;
public GameObject shotpoint;
public int damage;
private void Awake()
{
allLines = new List<Shocker>();
}
public void Update()
{
if (Input.GetKeyDown(KeyCode.X))
{
ShockerShooting();
}
}
public void ShockerShooting()
{
if (enemies.Count > 0)
//это чтобы игрок не мог стрелять, когда в радиусе нет врагов
{
for (int d = 0; d < enemies.Count; d++)
{
Shocker newLine = Instantiate(linePrefab);
allLines.Add(newLine);
newLine.AssignTarget(shotpoint.transform.position, enemies[d].transform);
}
foreach (var enemy in enemies)
{
enemy.TakeDamage(damage);
//скрипт врага, думаю, здесь не нужно показывать
}
}
}
/* это просто ищет игроков в радиусе, и я
не думаю, что как-то связано с проблемой*/
public void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.CompareTag("Enemy"))
{
enemies.Add(other.GetComponent<EnemyHealth>());
}
}
public void OnTriggerExit2D(Collider2D other)
{
if (other.gameObject.CompareTag("Enemy"))
{
enemies.Remove(other.GetComponent<EnemyHealth>());
}
}
В редакторе тот "лишний" луч появляется лишь иногда и на полсекунды, а при билде луч появляется каждый раз и чуть дольше. Думаю, это как-то связано со скоростью Юнити, мол, он не успевает задать правильное значение лучу и поэтому тот спавнится в начальных координатах. Ещё считаю важным подметить, что мои префабы лучей уничтожаются через определённое количество времени кодом, который висит на префабах (просто выполняет Destroy(gameObject) через float time времени). Когда я устанавливаю лучам, например, уничтожение через 5 секунд, а на экране только 3 врага, то спавнится 4 луча, три из которых направленны на врагов, а четвёртый в нулевые координаты. Четвёртый луч исчезает почти сразу, а те три луча уничтожаются только через пять секунд.
Как можно это всё исправить? Извините, если вопрос какой-то супер банальный или код супер кривой. Я вообще не шарю за LineRenderer и делал своё оружие по видео. Но в видео чувак делал фиксированное количество лучей, которые просто включаются/выключаются при нажатии кнопки и вылетает всегда из фиксировонного места, так что в своём куда я много чего поменял по "чуйке", но так как в лучах не разбираюсь, какие-то частички кода не понимаю.
Ответы (1 шт):
Не уверен, но возможно проблема в том что в AssignTarget
вы не устанавливаете положение врага, после без вызова Update
в Shocker
, Unity сразу запускает рендер из-за чего на 1 кадр появляется луч координаты игрока - 0,0. Хотя полсекунды слишком много для 1 кадра (При 60 fps в данном случаи луч появляется на ~16 миллисекунд). Попробуйте добавить установку координаты врага в AssignTarget
.