Mofrez Дата: Среда, 17 Февраля 2021, 19:08 | Сообщение # 1
уже был
Сейчас нет на сайте
Всем привет! Подскажите нужно ли оптимизировать скрипт и как? Там в функции Update прописаны все действия (проверка на расстояние между мобом и игроком, таймер атаки, состояния: патрулирование по указанным точкам, атака и тд.) и этот скрипт повешен на большое количество мобов на сцене. Игра на телефоны. И еще: как вы проектируете скрипты? Рисуете ли вы блок схемы кода, скриптов? В Unity какие аддоны есть для разработки скриптов?
Код
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyPatroling : MonoBehaviour { [SerializeField] Transform _player; [SerializeField] Transform[] _patrolPoint; [SerializeField] Enemy enemy; [SerializeField] float _timeBetweenAttack; Vector3 _startPoint; float _sightRange; float _distancePlayer; float _distanceStartPoint; float _distancePatrolPosition; float _speedMove; bool _returnStartPoint; bool _followPlayer; bool _patrolOrNot; bool _timeAttack; Animator _animator; int _movePoint; void Start() { _animator = GetComponent<Animator>(); enemy = GetComponent<Enemy>(); _timeBetweenAttack = 2.5f; _speedMove = 3f; _movePoint = Random.Range(0, _patrolPoint.Length); _patrolOrNot = true; _followPlayer = false; _returnStartPoint = false; _sightRange = 10f; _startPoint = transform.position; } void Update() { _distancePlayer = Vector3.Distance(_player.transform.position, transform.position); if (_returnStartPoint == true) { _timeAttack = false; _animator.SetBool("Run", true); ReturnStartPoint(); } if (_distancePlayer <= _sightRange && _returnStartPoint == false) { _patrolOrNot = false; _followPlayer = true; } if (_distancePlayer >= 2 && _timeAttack == true) { _animator.SetBool("Run", true); Following(); } if (_distancePlayer <= 2 && _timeAttack == true) { if (_timeBetweenAttack >= 2.5f) { _animator.SetBool("Run", false); _animator.SetTrigger("Attack"); enemy.Attack(); } _timeBetweenAttack -= 1 * Time.deltaTime; if (_timeBetweenAttack <= 0) { _timeBetweenAttack = 2.5f; } } if (_distancePlayer >= 3 && _timeAttack == true) { _timeBetweenAttack = 2.5f; } if (_followPlayer == true && _timeAttack==false) { _animator.SetBool("Run", true); Following(); } if (_patrolOrNot == true && _followPlayer == false && _returnStartPoint == false && _timeAttack == false) { _animator.SetBool("Run", false); Patrolling(); } } private void Following() { _distanceStartPoint = Vector3.Distance(_startPoint, transform.position); Quaternion _targetRotation = Quaternion.LookRotation(_player.transform.position - transform.position); transform.rotation = Quaternion.Slerp(transform.rotation, _targetRotation, 3f * Time.deltaTime); transform.position = Vector3.MoveTowards(transform.position, _player.position, _speedMove * Time.deltaTime); if (_distanceStartPoint >= 30f) { _followPlayer = false; _returnStartPoint = true; } if (_distancePlayer <= 2f) { _timeAttack = true; } } private void ReturnStartPoint() { Quaternion _targetRotation = Quaternion.LookRotation(_startPoint - transform.position); transform.rotation = Quaternion.Slerp(transform.rotation, _targetRotation, 3f * Time.deltaTime); transform.position += transform.forward* 6f * Time.deltaTime; _distanceStartPoint = Vector3.Distance(_startPoint, transform.position); if (_distanceStartPoint <= 5) { _returnStartPoint = false; _patrolOrNot = true; } } private void Patrolling() { { Quaternion _targetRotation = Quaternion.LookRotation(_patrolPoint[_movePoint].position - transform.position); transform.rotation = Quaternion.Slerp(transform.rotation, _targetRotation, 3f * Time.deltaTime); transform.position = Vector3.MoveTowards(transform.position, _patrolPoint[_movePoint].position, _speedMove * Time.deltaTime); _distancePatrolPosition = Vector3.Distance(_patrolPoint[_movePoint].position, transform.position); if (_distancePatrolPosition <= 3f) { _movePoint = Random.Range(0, _patrolPoint.Length); } } } }
Сообщение отредактировал Mofrez - Среда, 17 Февраля 2021, 19:25