то оно спавнит линию, которая идет от персонажа до точки попадания, если рейкаст попадает, то все нормально, но если я буду стрелять в "небо", то линия будет странно спавнится. Как это пофиксить? Вот код: https://pastebin.com/5NuPNSUH
Точка попадания не нужна. Достаточно получить точку старта и поворот ствола — это и будет луч.
Этот луч не должен проходить сквозь объекты и должен останавливаться при попадании
Не очень понял, как это применить к видосу выше. Луч у тебя не проходит сквозь объекты
Я говорю про линию, которую я спавню, а не про луч который рейкаст делает
Правильно, потому что позиция LineRenderer'а начинается в точке спавна, а заканчивается в точке попадания
Ну вот. А в случае бесконечности ты получишь направление вектора, умножаешь на его длину и получишь координату крайней точки в пространстве.
Может надо при не попадании не умножать дистанцию на стартовую позицию, а прибавлять? shootLine.Construct(linePos, linePos + data.range);
Нельзя вектор на число умножить
первое что бросается в глаза, это то что у тебя старт идёт из камеры а не из орудия а так я думаю проблемма заключается где то в данном участке кода ShootLine shootLine = Instantiate(hitVfxData.shootLine); shootLine.Construct(linePos, linePos * data.range); Ты как то возможно не верно определяешь конечную точку Вот что мне предложил чат гпт using System; using UnityEngine; namespace VOne.Project.Scripts { public class Weapon : MonoBehaviour { public WeaponData data; public HitVfxData hitVfxData; private float nextTimeForFire = 0f; private void Update() { if (Input.GetButtonDown("Fire1") && CanShoot()) { Shoot(); } } private bool CanShoot() { if (Time.time >= nextTimeForFire) { nextTimeForFire = Time.time + 1f / data.rate; return true; } return false; } private void Shoot() { var ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0)); var linePos = transform.position; if (Physics.Raycast(ray, out var hit, data.range, data.layer)) { HandleHit(hit, linePos); } else { // Если луч не столкнулся с объектом, рисуем линию на максимальное расстояние Vector3 endPoint = ray.GetPoint(data.range); DrawLine(linePos, endPoint); } } private void HandleHit(RaycastHit hit, Vector3 linePos) { DrawLine(linePos, hit.point); if (hit.transform.TryGetComponent(out Hitable hitable)) { switch (hitable.type) { case ObjectType.Enemy: // Обработка попадания во врага break; case ObjectType.Wood: // Обработка попадания в дерево break; case ObjectType.Sand: // Обработка попадания в песок break; case ObjectType.Metal: // Обработка попадания в металл break; case ObjectType.Rock: // Обработка попадания в камень break; default: throw new ArgumentOutOfRangeException(); } } } private void DrawLine(Vector3 start, Vector3 end) { // Создать объект линии или пули и отобразить его между start и end } } }
Ну тогда создавать новый вектор, прибавляя linePos.x/y/z range, но лучше конечно как Александр написал)
Вот так сделал и всё работает
Обсуждают сегодня