Задать вопрос
Ответы пользователя по тегу C#
  • Instance по логике Bootstrap?

    @DrRen7
    Ну я б сделал машину состояний и сделал её инстансом а лучше бы используя какой di
    в BootstrapState я б все зарегистрировал и передал бы дальше по di
    потом бы какой то LoadLevelState потому как при загрузке уровня тож надо делать одни и вещи на входе и выходе
    Ответ написан
    Комментировать
  • Как правильно оформить логику Bootstrap для Player.cs в Initialize()?

    @DrRen7
    Подход к архитектуре у всех разный, ну если вы хотите использовать Bootstrap.
    Для начала Update() это метод цикла юнити он взаимосвязан со start и awake, тк у MonoBehaviour нет конструктора тут на нужен какой то Initialize(). Что бы все это работало есть хорошая практика это создавать объект на сцене.
    Получается в Bootstrap мы регистрируем сервисы и инфраструктуру, потом инстанциируем игрока и через Initialize() сразу прокидываем что надо. Выносим создание и настройку игрока в отдельный метод, ну и по сути у нас получилось фабрика)
    Возможно для реализации вам понадобится какие то скрипты загружать раньше https://docs.unity3d.com/6000.0/Documentation/Scri... ,но на практике если все делать верно оно не надо , Bootstrap по сути и нужен что бы все загружать последовательно
    Ответ написан
    Комментировать
  • Как называется паттерн, который добавляет объекту новый функционал?

    @DrRen7
    Модификация объекта через сам объект это Fluent Interface, а вот добавление нового функционала что декоратор.
    Разница в том при Fluent Interface AddSomeComponen(I) должна быть, а при декораторе как вы заметили просто обертка
    Ответ написан
    Комментировать
  • Запечь вместе с ProBuilder несколькими текстурами?

    @DrRen7
    надо переписать вот это блок
    uvs.Add(new Vector2(0, 0));  // нижний левый
        uvs.Add(new Vector2(0, 1));  // верхний левый
        uvs.Add(new Vector2(1, 0));  // нижний правый
        uvs.Add(new Vector2(1, 1));  // верхний правый

    1 meshrenderer это 1 материал
    смысл в том что б тектура имела все материла
    ну делаешь материал 2х2 потом передашь id материала и допустим если 1 мариал то
    uvs.Add(new Vector2(0, 0));  // нижний левый
        uvs.Add(new Vector2(0, 0.5));  // верхний левый
        uvs.Add(new Vector2(0.5, 0));  // нижний правый
        uvs.Add(new Vector2(0.5, 0.5));  // верхний правый

    если материал 4
    uvs.Add(new Vector2(0.5, 0.5));  // нижний левый
        uvs.Add(new Vector2(0.5, 1));  // верхний левый
        uvs.Add(new Vector2(1, 0.5));  // нижний правый
        uvs.Add(new Vector2(1, 1));  // верхний правый

    материал ну как чекер и каждая клетка это другой материал надо будет добавить офсет что бы при тайлинге не было видно швов
    Ответ написан
  • Почему после запекания и объединения мешей остается еще 1 грань?

    @DrRen7
    а если в RemakeBlock() сработал Raycast не надо пересчитать мэш в который он попал ?
    Но лучше отказаться от RemakeBlock(), сделать трехмерный массив(размером чанка с типами блоков) добавлять блоки в массив а в RemakeBlock() делать проверку на типо
    if (_сhunks(this.x,this.y,this.z+1)==BlockType.empty) GenerateFrontSide();

    плюс в том чанк легко сгенерировать, и можно можно хранить различные типы блоков

    По сути надо отказать от создания конкретного блока и перейти в создание массива блоков, надо что бы где то массив чанков заполнился потом отправить его в этот скрипт и пробежаться for'ом по массиву и генерировать так если this.x,thiz.z,this.z == BlockType.empty &&this.x,thiz.z,this.z+1 != BlockType.empty => GenerateFrontSide() а в метод ещё и тип поверхности можно передать
    Ответ написан
  • Текст урона/лечения в Unity не появляется в режиме Game, но есть в Scene. Почему?

    @DrRen7
    Ну так если у вас новый canvas там трансформ а вы преобразуете (Camera.main.WorldToScreenPoint(textSpawnPoint.position)) в RectTransform вот и получаете позицию x и y в пикселях
    Попробуйте создать объект на сцене(без Instantiate) и просто сменяйте его трансформ по позиции в Game, после уже работаете с Instantiate
    Ответ написан
    Комментировать
  • Почему 3д персонаж не прыгает?

    @DrRen7
    _controller.isGrounded плохо срабатывает там подобрать Skin width
    лучше использовать свое решение, ну как пример
    private void GroundCheker()
        {
            Vector3 chechSpherePos = new Vector3(transform.position.x, transform.position.y + _sphereOffSet, transform.position.z);
            _isGround = Physics.CheckSphere(chechSpherePos, _sphereCheckRad, _groundMask);
        }
        //private void OnDrawGizmos() //visDebug
        //{
        //    Gizmos.color = Color.red;
        //    Gizmos.DrawSphere(transform.position + Vector3.up * _sphereOffSet, _sphereCheckRad);
        //}
    Ответ написан
    Комментировать
  • Можно ли исполнять функции вне скриптов?

    @DrRen7
    Ну нужна будет база со всеми "триггерами" и действиями, что б первые и вторые реализовывали интерфейсы. Ну и скрипт, что все это проинициализирует.
    Есть паттерн стратегия и фабричный метод , из этого думаю слепить получится
    Ответ написан
    Комментировать
  • Unity вид от 1 лица и вид игроков на другого игрока?

    @DrRen7
    Для 1 лица мы используем полную модель только для создания тени а сам мэш выключаем.
    Если же это там надо для мп, то делаем так при инициализации игрока и только у владельца условно
    using Unity.Netcode;
    using UnityEngine;
    
    public class Owner : NetworkBehaviour
    {
        [SerializeField]MeshRenderer _mR;
    
        private void Start()
        {
            if (IsOwner) HideModel();
        }
    
        void HideModel() 
        {
            _mR = GetComponent<MeshRenderer>();
            _mR.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;
        }
    }
    Ответ написан
    Комментировать
  • Как сделать подчеркивание ошибок в Visual Studio 2022?

    @DrRen7
    Модули для в студии есть?
    67e19f1da40db675960942.png
    Ассет в юнити ?
    67e19f3474756959793115.png
    Ответ написан
    7 комментариев
  • Достаточно ли изучить синтаксис C# для создания игры на Unity?

    @DrRen7
    Самый минимум в C# это понимать что такое классы, но лучше понимать принципы ООП это просто минимум. Потом следует знать жизненный цикл MonoBehaviour, что точно надо знать векторная математика и тригонометрия это класс Math(Mathf). По сути это минимум для начало создания/обучения, дальше все уже зависит от реализации, но обычно все уже придумано есть паттерны
    Ответ написан
    1 комментарий
  • Как заставить платформу переносить предметы с физикой?

    @DrRen7
    У платформы есть изменение в размерах?
    Когда используешь парент к объекту с измененным скейлом такое происходит
    Ответ написан
  • В Unity корутина не может вовремя запустить сама себя после void Start(). Как заставить корутину запускать себя моментально?

    @DrRen7
    yield return new WaitForSeconds(0); это по сути апдейт
    Задержка в пол секунды это от старта до первого апдейта
    public IEnumerator Enumsdsdsdsd()
    {
    yield return new WaitForSeconds(0); // если будет тут то все запустится с первым апдейтом
    for (int i = 0; i < playedXTimes; i++)
    {
    audioSource.clip = music;     // это скорее всего не надо
    audioSource.PlayOneShot(music);
    
    }
    yield return new WaitForSeconds(0); //если тут то все запустится при старте
    }
    Ответ написан
  • Почему персонаж не ходит 2д?

    @DrRen7
    rb = GetComponent();  //какой?
    rb = GetComponent<Rigidbody2D>(); // надо

    moveInput = Input.GetAxis("Horizontal");
    считываем инпут в update
    https://docs.unity3d.com/6000.1/Documentation/Scri...
    ну да ещё и старт с маленькой буквы) переписал
    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
        private Rigidbody2D _rb2d;
        [SerializeField] private float _speed=2f;
        private float _inputX;
        private Vector2 _moveDir;
        private void Start()
        {
            _rb2d = GetComponent<Rigidbody2D>();
        }
        private void Update()
        {
            _inputX = Input.GetAxis("Horizontal");
        }
        private void FixedUpdate()
        {
            _moveDir = transform.right * _inputX;
    //_moveDir.y = _rb2d. linearVelocity.y  // падение и прыжек пока выкл 
            _rb2d.linearVelocity= _moveDir*_speed;
        }
    }
    Ответ написан
    Комментировать
  • Как исправить ошибку NullReferenceException в Unity, хотя вроде всё есть?

    @DrRen7
    так а где FSM ?
    перед DealDamage уже должен сработать OnStateEnter
    Ответ написан
  • Не работает OnCollisionCollider с дочерними объектами в Unity, что делать?

    @DrRen7
    Скинь хоть посмотреть что есть и примерно что там с коллайдерами
    А так по сути ИИ и не должен хоть как то взаимодействовать с оружием, это оружие взаимодействует с ИИ. Те оружие должно находить ИИ (точнее скрипт а лучше интерфейс) и вызывать метод с получением урона.
    Вопрос как получить оружию скрипт с дамагой, можно и через коллизию но тогда стоит проверить что есть все компоненты типа коллайдера в и риджедбоди. Другой вариант это использовать физические касты, тут есть несколько вариантов это использовать 1 каст сферы и сделать ограничение по градусам от лица игрока. Другой вариант это нацепить на оружие касты и вызывать их. Это будет как то так 6752e4882f369424392742.png
    по реализации https://docs.unity3d.com/ru/current/ScriptReferenc... для первого
    для второго https://docs.unity3d.com/ru/current/ScriptReferenc...
    Ответ написан
  • Как сделать обход препятствий в 2.5d Unity-игре?

    @DrRen7
    как вариант просто один навмешь
    67080aa7b00d2608603939.jpeg
    я вот не знаю как с мостом быть наверно вот там и будет нужен линк
    Ответ написан
  • Что делать если префаб врага не находит кординаты игрока?

    @DrRen7
    Префаб не сохранит ссылку на трансформ объекта что не входит в префаб.
    Нужно добавить метод на Transform player
    Добавь в enemy
    public void SetTarget(Transform target)
     {
         player = target;
     }

    В скрипт что будет делать инстанс надо добавить ссылку на игрока
    GameObject newEnemy = Instantiate(_enemy.gameObject);
     newEnemy.GetComponent<Enemy>().SetTarget(_player.transform);

    Ну и так по скрипту пройдись
    Transform player == (Player)pl.gameObject.transform
    Transform enemy ==this.transform == enemyObject.transform

    по сути тебе надо во врага передать ссылку на скрипт игрока потому как есть методы что с ним взаимодействуют а имея скрип можно получить и transform
    Ответ написан
  • Проблема с юнити 2D?

    @DrRen7
    надо просто изменить интерфейс
    самый просто способ скинуть все в default
    66f1af55cc581601912655.png
    или же открыть все нужные окна в ручную
    Windows -> General(там первый блок точно нужен) они же открываются на ctrl + (1-5)
    должно быть примерно так
    66f1b0b892915907484227.png
    Ответ написан
    Комментировать