Ответы пользователя по тегу C#
  • Как повернуть объект в сторону его движения?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    transform.right = moveSpots[randomSpot].position - transform.position;
    Ответ написан
    Комментировать
  • Как перемещать gameObject по тегу?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Я бы избавился от тега. Даже если префабы разные, но сущность одна, нужно создать абстракцию, и искать по ней

    public abstract class Player : MonoBehaviour
            {
                
            }
            
            public class PlayerA : Player
            {
                
            }
            
            public class PlayerB : Player
            {
                
            }


    Но даже такой подход плох. Лучше создать отдельный класс который будет знать и о карте и о игроке, и давать карте игрока когда тот существует, и говорить карте не отображать игрока когда его убили.
    Ответ написан
    Комментировать
  • Как переделать Task в UniTask?

    PragmaGames
    @PragmaGames Автор вопроса
    Увлекаюсь Unity.
    private async UniTask PlayAsyncUniTask()
    {
         var token = new CancellationTokenSource();
    
         Play(() =>
         {
                token.Cancel();
                token.Dispose();
         });
                
         await UniTask.WaitUntilCanceled(token.Token);
    }
    Ответ написан
    Комментировать
  • Как я могу создать несколько рэйкастов для одного объекта?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Ты можешь использовать Physics.OverlapSphere. Дальность рейкаста будет дальностью видимости персонажа в твоем случае. После из всех полученных объектов найдешь тех которые попадают в поле видимости.

    private bool IsVisibleTarget(Vector3 target)
    {
           directionToTarget = (target - myTransform.position).normalized;
           return Vector3.Angle(entityTransform.forward, directionToTarget) < _viewAngle / 2;
    }


    _viewAngle угол обзора твоего персонажа.

    Я думаю такой метод самый оптимальный.

    Если говорить про твой метод то тебе через цикл нужно пускать лучи с определенным смещением. Минус твоего метода в том что чем дальше объект и больше обзор тем больше лучей придется выпустить с меньшим смещением.
    Ответ написан
    Комментировать
  • Почему не стартует корутина?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Ты каждый FixedUpdate() стартуешь карутину, не делай так.
    Ответ написан
    5 комментариев
  • Как записать движения персонажа в unity2D?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Самый наивный вариант это сделать очередь из Transform и записывать каждое изменение позиции игрока в эту очередь. Потом когда нужно воспроизводить действие извлекаем элементы и передаем в вашу функцию движения. Данный вариант брошен навскидку и имеет ряд недостатков, один из них потребляемая память на хранения всех позиций. Улучшить его можно тем что мы будем сохранять ключевые позиции игрока, а промежуточные данные генерировать исходя от того откуда идем , куда идем и каким образом. Пример ключевых позиций : персонаж начал идти , потом перешел на бег, закончил бег, начало прыжка, пиковая позиция прыжка, приземление.

    Transform player;
    Queue<Transform> positions;
    
    private void Start()
    {
         player = GetComponent<Transform>();
         positions = new Queue<Transform>();
    }
    
    private void Update()
    {
        Move()
    }
    
    private void Move()
    {
         // move
        positions.Enqueue(player.transform);
    }
    Ответ написан
    4 комментария
  • Как прибавлять число к переменной int через 5 секунд?

    PragmaGames
    @PragmaGames
    Увлекаюсь Unity.
    Вы можете использовать класс Timer c#, либо использовать корутину или invoke. Советую 2 последних варианта.

    https://docs.unity3d.com/ScriptReference/MonoBehav...

    https://docs.unity3d.com/ru/2019.4/Manual/Coroutin...

    int N = 10;
    int a = 0;
    float time = 5.0f;
    
    void Start()
    {
            Invoke("increment",  time);
    }
    
    void increment()
    {
            a += N;
    }
    Ответ написан
    Комментировать