• Почему туррель убивает самого ближайщеговрага а потом не стреляет других пока они не станут ближе последнего?

    @DrRen7
    Ad1yar,
    Думаю это надо использовать как то по другому.
    как минимум
    GameObject[] zombies = GameObject.FindGameObjectsWithTag("Zombie");
            foreach (GameObject zombie in zombies)
            {
                octree.Add(zombie, zombie.GetComponent<Collider>().bounds);
            }

    ты если заходишь в метод сразу добавляешь, там могут быть повторные?

    List<GameObject> nearbyZombies = new List<GameObject>();

    листы не надо постоянно создавать 1 раз создай в глобальных и просто очищай его.
    Далее
    if (!zombie.isAlive)
                    {
                        closestDistanceSqr = maxDistance * maxDistance;
                        target = null;
                    }

    как я понял ты объект не уничтожаешь, тогда вопрос есть вариант что он станет опять таргетом? вероятно в цикле выбора цели стоит сделать проверку на isAlive
    Написано
  • Почему туррель убивает самого ближайщеговрага а потом не стреляет других пока они не станут ближе последнего?

    @DrRen7
    Ad1yar, я чучуть упростил должно работать лучше
    void LockTarget()
       {
           Collider[] zombies = Physics.OverlapSphere(turret.transform.position, maxDistance, _targetMask);
           Transform target = null; //должна быть глобальная или передавать через return
           if (!(zombies.Length > 0)) return;
           float mindist = maxDistance;
           foreach (Collider c in zombies)
           {
               float currentDist = Vector3.Distance(turret.transform.position, c.gameObject.transform.position);
               if ((currentDist<mindist))
               {
                   mindist = currentDist;
                   target = c.gameObject.transform;
               }
           }
       }

    Плюс в Shot не надо будет таргет null и тд, а так кинуть LockTarget() в апдейт или запускать его через шут через Transform LockTarget() .... return;
    Написано
  • Как симметрично изменить позу?

    @DrRen7
    Senseich,
    Ну это проблема использования чужих моделей, вот эта явно была сделана для рендера в блендере. Для игр она не подходит сетка не оптимизированная. Если б она была для игр я б ее в пэйнтер кинул и там бы сделал все нужные текстуры, и не парил ся бы с нодами в блендере, хотя по хорошему ноды надо запекать в текстуры,что бы нагрузка была меньше.
    А так да 3 д не так просто, и чем дальше тем сложнее, закинуть модельку это одно потом ещё надо что б работала правильно анимация, и не дай бог у тебе есть нужная анимация от другого рига)
    Написано
  • Как симметрично изменить позу?

    @DrRen7
    Senseich,
    можешь попробовать 66477d5a32a4c490785383.png
    но будет хуже, можно сравнить как видео без постпродакшена
    Написано
  • Как симметрично изменить позу?

    @DrRen7
    Senseich,
    Тебе надо просто материал запеч, условно все ноды применить и превратить в растровое изображение по UV.
    Там просто есть ноды, что поддерживает только блендер
    Нашел видос там вроде все понятно
    Написано
  • Как симметрично изменить позу?

    @DrRen7
    Senseich,
    попробовал 6646754fc0d95321979302.png
    вот с такими настройками текстура остается в fbx
    материал просто ссылка на текстуру
    664675c69fc6d188590309.png
    В юнити потом просто выбрать и вытащить текстуру
    6646774d1a9b1953734328.png
    Написано
  • Как симметрично изменить позу?

    @DrRen7
    Senseich,
    А куда потом это идет? фроде фбх не содержит текстуры, вот не помню но скин меш кости и материл юв должен быть
    Написано
  • Как симметрично изменить позу?

    @DrRen7
    Плюс еще аддоны есть типо Copy Attributes
    6646457d70346950629960.png
    Риг вот так будет выглядеть и все лишнее отключено и соответственно можно копировать полный трансформ.
    Написано
  • Почему выдает ошибка о том что индекс вышел за пределы?

    @DrRen7
    Araya,
    используй не массивы, а листы или создай новый массив
    zombs = new GameObject[zObjs.Count];
    Написано
  • Как решить ошибку build в unity?

    @DrRen7
    varfnik,
    Ну все проблема в настройке компилятора, что бы точно это подтвердить создай новый проект и сделай его билд, если сбилдится значит что то точно не то с настройками, который вы поставили. Я увы не помогу настроить там потому как там много, что может ломать быстрее самому все пробовать.
    А вот если ошибка появится то лучше удалить андройд модули и скачать из званого.
    Написано
  • Почему зомби (NavMesh) стоят некоторое время а потом идут к цели?

    @DrRen7
    Ad1yar,
    Ну как вариан это все можно чутка оптимизировать

    targets.AddRange(manager.turrets);
            mainBase = manager.mainBase;
            player = manager.btr.transform;
            if (targets.Count != 0) target = targets[Random.Range(0, targets.Count)];
            else target = null;
            btr = player.GetComponent<BTR>();

    это все можно в менеджере сделать к ниму обраться и получить все с него.
    добавь в конце Start
    _agent.SetDestination(_target.position);
    Менеджер уже задан или собирается? если собирается попробуй собрать не в старте а в Awake.
    И попробуй target подебажить
    Написано
  • Почему зомби (NavMesh) стоят некоторое время а потом идут к цели?

    @DrRen7
    Ad1yar, ну достаточно спорно зачем, по сути такое можно использовать если у тебя объект все должен делать одно действие, но в данном случаи у тебя одни боты будут идти другие стоять третьи атаковать, и уже у них у всех разный по длине список действий. Если тебе надо условно 1 апдейт и 1000 зомби и оптимизацию смотри Entities(DOTS). Если хочешь оптимизировать проект смотри на пуллер объектов, и Корутины можно update игнорировать и включать их, выключать что то не нужно.

    Синь скрипт на поиск таргета, а то обычно они должны тупить когда их очень много
    Написано
  • Как решить ошибку build в unity?

    @DrRen7
    varfnik,
    Попробуй сбилдить только пустую сцену с условно крутящимся кубом
    private void Update()
     {
         transform.rotation *= Quaternion.Euler(transform.rotation.x + 150f*Time.deltaTime, 0, 0);
     }
    }

    если она не сбилдится то проблема с настройками компилятора
    если все будет норм то ищи ошибку в проекте, там условно может быть кнопка на которой есть скрипт который был удален и тд
    Написано
  • Как решить ошибку build в unity?

    @DrRen7
    varfnik, 66433e6dcbca9118238086.png
    вот такую ошибку выдает?
    Написано
  • Почему зомби (NavMesh) стоят некоторое время а потом идут к цели?

    @DrRen7
    Ad1yar,
    Во первых я поменял смысл когда враг идет. Если нет цели он стоит и ищет цель, если он подходит к цели он пытается ударить. Получается у нас приоритет это дойти по цели а не в проверки тех кто нас окружает.

    Во вторых надо сделать нормальное древо анимации, по сути ходьба бег и стояние на месте ничем не отличаются кроме скорости движения, Получается делаем в аниматоре переменную флот идл->ходьба->бег меняем через флот. Ну атака будет из идла идти , если есть смерть это прерывание.

    Ну это самый базовый скрипт, плюс чутка оптимизации. Плюс ещё вопрос как у тебя получается target
    Написано
  • Как решить ошибку build в unity?

    @DrRen7
    varfnik,
    так если не помогло идешь в папку
    b:\\unity\2022.3.11f\editor\data\playbackengines\AndroidPlayer\SDK\building-tools
    там будет папка номерная заходишь в папку ищешь файл source.properties в файле строчка Rkg.Revision="___"
    В общем надо чо бы цифры в этой строке совпадали в цифровой папкой, лучше папку переименовать
    Написано
  • Почему зомби (NavMesh) стоят некоторое время а потом идут к цели?

    @DrRen7
    Ad1yar, главное ещё агента настроить
    using System.Collections;
    using UnityEngine;
    using UnityEngine.AI;
    
    public class BaseAi : MonoBehaviour
    {
        float _currentHeal;
        NavMeshAgent _agent;
        Coroutine _MoveTo;
        Coroutine _TargetSearch;
    
        float _speed;
        [SerializeField] float _walkSpeed=5f;
        Transform _target;
        LayerMask _targetMask;
        bool _IsAlive;
        Animator _animator;
        private void Start()
        {
            _IsAlive = true;
            _agent = GetComponent<NavMeshAgent>();
            _animator = GetComponent<Animator>();
            _TargetSearch = StartCoroutine(TargetSearch());
        }
    
        IEnumerator TargetSearch() //там свой способ для поиска используй, это просто для примера
        {
            while (true)
            {
                Collider[] colliders = Physics.OverlapSphere(transform.position, 25f, _targetMask);
                if (colliders.Length != 0)
                {
                    _target = colliders[Random.Range(0, colliders.Length)].transform;
                }
                yield return new WaitForSeconds(0.5f);
            } 
        }
    
        void SearchOff()
        {
            StopCoroutine(_TargetSearch);
            _TargetSearch= null;
        }
        void BrainOff()
        {
            StopCoroutine(_MoveTo);
            _MoveTo = null;
        }
        private void Update()
        {
            if (_IsAlive)
            {
                if (_target == null && _TargetSearch == null) _TargetSearch = StartCoroutine(TargetSearch());
                if (_target != null && _TargetSearch != null) SearchOff();
                if (_target != null && _MoveTo == null) _MoveTo = StartCoroutine(WalkTo());
                if (_target == null && _MoveTo != null) BrainOff();
    
    
                _animator.SetFloat("MoveSpeed", _agent.speed); // переключать анимацию мы будем через скорость самого зомби 
            }
    
        }
    
        IEnumerator WalkTo()
        {
            while (true)
            {
                _agent.SetDestination(_target.position);
                if (_agent.remainingDistance! > _agent.stoppingDistance) TryAttack();
                if(_agent.remainingDistance>15f) yield return new WaitForSeconds(0.8f); //SetDestination ресурсоемкая команда
                else yield return new WaitForSeconds(0.2f);                            //делаем бота более распоропнее, чем ближе он подходит 5 раз в секунду вероятно тож много 
    
            }
        }
    
        void TryAttack()
        {
            _agent.speed = 0f;
            _animator.SetTrigger("Attack");
            Invoke("RetrigetAttack", 0.5f); //отжатие триггера на атаку, лучше сделать через анимацию, а так надо поставить примерное время анимации удара
            Collider[] colliders = Physics.OverlapSphere(transform.position+transform.up+transform.forward*0.5f, 1.5f, _targetMask);
            foreach (Collider collider in colliders)
            {
                switch (collider.tag) // можно сделать проще повесить на все элементы скрипт Heals и брать только его 
                {
                    case "Player":
                        if (collider.TryGetComponent(out Mover btr))     //у меня тут свои скрипты будут 
                        {
                            btr.TakeDamage(Random.Range(25, 35));
                        }
                        break;
                    case "Turret":
                        if (collider.TryGetComponent(out Turret turret))
                        {
                            turret.TakeDamage(Random.Range(20, 30));
                        }
                        break;
                    case "Base":
                        if (collider.TryGetComponent(out Base Mybase))
                        {
                            Mybase.TakeDamage(Random.Range(70, 90));
                        }
                }
            }
            
    
        }
    
        public void RetrigetAttack() //триггер его можну отдажть через анимацию или коррутину
        {
            _animator.ResetTrigger("Attack");
            _agent.speed = _walkSpeed;
        }
    
    
        public void TakeDamage(float damage)
        {
            _currentHeal -= damage;
            if (_currentHeal! > 0) Die();
        }
        void Die()
        {
    
            _IsAlive = false;
            if(_TargetSearch!=null) SearchOff();
            if(_MoveTo!=null)BrainOff();
            _agent.enabled = false;
            _animator.SetTrigger("Die");
    
        }
    }
    Написано
  • Почему зомби (NavMesh) стоят некоторое время а потом идут к цели?

    @DrRen7
    Щас попробуй что нить накидать, я только не понимаю зачем тут коррутина.

    плюс есть не значимые места типо
    foreach (Collider coll in colliders)
                        {
                            if (coll != null)


    или
    if (hp > 0)
                {

    да и выдавать одинаковую(по смыслу) анимацию через булиен тож такое
    Написано
  • Как можно исправить поворот ракет?

    @DrRen7
    Блок с ракетами стоит нормально, а трансформ самих ракет какой? вероятно блок сделан был в юнити а потом скинут трансформ, но ракеты получили новый трансформ родительский-дочерний. В общем трансформ самих ранет надо на 0 оставить, ну оффсет по позициям только оставить
    Написано