Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C# код не работает помогите я новичок

Данил Програмист Ученик (176), на голосовании 8 месяцев назад
using UnityEngine;

public class Shooting : MonoBehaviour
{
public string targetTag;
public float shootRange = 10f;
public GameObject bulletPrefab;
public Transform shootPoint;
public float bulletSpeed = 10f;
public float nearestDistance;

void Start()
{

InvokeRepeating("Ves", 0f, 0.01f);

}


void Update()
{
GameObject[] targets = GameObject.FindGameObjectsWithTag(targetTag);
GameObject nearestTarget = null;
float nearestDistance = Mathf.Infinity;

// Находим ближайший объект с заданным тегом
foreach (GameObject target in targets)
{
float distance = Vector3.Distance(transform.position, target.transform.position);
if (distance < nearestDistance)
{
nearestDistance = distance;
nearestTarget = target;
}
}



}
void Ves()
{
if (nearestTarget != null && nearestDistance <= shootRange)
{
GameObject a1 = (GameObject)Instantiate(bulletPrefab, transform.position, transform.rotation);

}
}
}
Голосование за лучший ответ
Wqwqw Wqefhgiff Мастер (1243) 9 месяцев назад
Твой скрипт определяет класс `Shooting` с функциональностью для стрельбы пулями в ближайшую цель в пределах определённого расстояния. Однако есть несколько проблем и возможных улучшений, которые можно внести в твой скрипт, чтобы он работал правильно.

1. Область видимости `nearestTarget` - переменная `nearestTarget` объявлена внутри функции `Update`, в то время как она должна быть членом класса, чтобы сохранять своё значение между вызовами функций и быть доступной для функции `Ves`.

2. Создание пули - ты создаёшь пулю в `transform.position`, что является позицией объекта, к которому прикреплён этот скрипт, но у тебя есть `shootPoint`, который, по-видимому, предназначен для этой цели.

3. Движение пули - ты создаёшь пулю, но нет кода для её движения. Обычно добавляют компонент Rigidbody к пуле и применяют силу или устанавливают её скорость, чтобы она двигалась вперёд.

4. Эффективность - поиск игровых объектов по тегу в каждом кадре в методе `Update` и затем выполнение расчётов расстояний может быть очень неэффективным, особенно если на сцене много объектов. Возможно, стоит оптимизировать это, проверяя реже или используя другой подход для нахождения ближайшей цели.

Вот переработанный ваш скрипт с некоторыми из этих изменений:

```csharp
using UnityEngine;

public class Shooting : MonoBehaviour
{
public string targetTag;
public float shootRange = 10f;
public GameObject bulletPrefab;
public Transform shootPoint;
public float bulletSpeed = 10f;
private GameObject nearestTarget; // Это должно быть приватным и находиться в области класса
private float nearestDistance;

void Start()
{
InvokeRepeating("Fire", 0f, 0.1f); // Изменил название метода на 'Fire' чтобы соответствовать его функциональности
}

void Update()
{
GameObject[] targets = GameObject.FindGameObjectsWithTag(targetTag);
nearestDistance = Mathf.Infinity; // Сбросить nearestDistance в каждом кадре
nearestTarget = null; // Сбросить nearestTarget в каждом кадре

// Найти ближайший игровой объект с указанным тегом
foreach (GameObject target in targets)
{
float distance = Vector3.Distance(transform.position, target.transform.position);
if (distance < nearestDistance)
{
nearestDistance = distance;
nearestTarget = target;
}
}
}

void Fire()
{
if (nearestTarget != null && nearestDistance <= shootRange)
{
// Создать пулю в позиции и с направлением shootPoint
GameObject bullet = Instantiate(bulletPrefab, shootPoint.position, shootPoint.rotation) as GameObject;
Rigidbody bulletRigidbody = bullet.GetComponent<Rigidbody>();
if (bulletRigidbody != null)
{
// Приложить силу вперёд к пуле
bulletRigidbody.velocity = shootPoint.forward * bulletSpeed;
}
}
}
}
```

Не забудь назначить `shootPoint` в редакторе и убедиться, что у `bulletPrefab` прикреплён компонент Rigidbody. Если пули должны подвергаться влиянию гравитации, убедитесь, что Rigidbody использует Gravity; в противном случае, вы можете это отключить для космического поведения.
Похожие вопросы