Контрол на символи с помощта на мишката в Unity
Стандартните контроли на активи в Unity имат няколко скрипта, движещи се само с клавиатурата и клавиатурата и мишката, но няма скрипт за движение с помощта на мишката("Diablo-style"). Скриптовете ще бъдат написани на C#.
За да проверите всичко, което ще бъде написано, ще ви трябва сцена и обекти, поставени върху нея. Има само 4 от тях, това са:Характер (използвах: Стандартни активи -> Контролери на персонажи -> Контролер от 3-то лице),Камера, Обект, действащ като цел, използвах капсула, можете да използвате само празен обект, ако не искате да виждате накъде отива вашият герой, и терена, по който ще се движим. Да започнем със скрипта на камерата.
public class MouseCamera : MonoBehaviour // Позиция на целеви обект public Transform target; // Слой(ове), които отговарят на щракване публична маска на LayerMask; // Контролиран персонаж публичен играч MousePerson; // Вектор на изместване частна векторна посока; // Информация за лъчи RaycastHit hit;
void Update() if (Input.GetMouseButtonUp(0)) // Получаване на посоката на лъча Лъч лъч = camera.ScreenPointToRay(Input.mousePosition); // Хвърлете лъч с безкрайна дължина и проверете пресечната точка на слоевете if (Physics.Raycast(ray, out hit, Mathf.Infinity, mask)) // Проверете какво се е върнало и преместете нашата цел там target.position = hit.point;
// Разказване на героя за новата "задача" player.GetTarget(target.position); > > > > Скриптът проверява дали щракналото място пресича обекта(ите), посочени в слоя, премества целевия обект на това място и "казва" на героя да се премести на това място. Скриптът на знаците е малко по-голям, но не прекалено сложен. използване на UnityEngine;
публичен клас MousePerson: MonoBehavior //Характер CharacterController играч; // Радиус, в който героят мисли, че е в целта public float radiusNoClick = 3f; // Координати на целта public Vector3 target = Vector3.zero; // Вектор на изместване частна векторна посока; // Скорост на въртене public float speedRotation = 10f; // Скорост на движение public float speedMove = 45f; // Символен маркер, на място или не private bool onPlace = true; // Анимации private Animation _animation; // Състояния enum CharacterState > Ходене=1, > // Състояние private CharacterState _characterState;
void Start() // Получаване на анимации _animation = GetComponent(); // Вземете героя player = (CharacterController)gameObject.GetComponent(typeof(CharacterController)); >
void Update() if (!onPlace) // Изчисляване на вектора на изместване direction = target - this.transform.position; // Нормализиране, така че героят да не гледа към земята, а право напред direction = new Vector3(direction.x, 0, direction.z); посока. Нормализиране();
// Обърни се Quaternion look = Quaternion.LookRotation(direction); this.transform.rotation = Quaternion.Slerp(this.transform.rotation, look, Time.deltaTime * speedRotation);
// Преместване player.Move(direction * Time.deltaTime * speedMove);
// Персонаж в движение _characterState = CharacterState.Walking; > else // Символът е в покой _characterState = CharacterState.Idle;
if (_animation) // Включете желаната анимация в зависимост от състоянието if (_characterState == CharacterState.Walking) _animation.Play("walk", PlayMode.StopAll); друго ако (_characterState == CharacterState.Idle) _animation.Play("idle", PlayMode.StopAll); > >
public void GetTarget(Vector3 target) // Проверете позицията на Target if ((Mathf.Abs(transform.position.x - target.x) >= radiusNoClick) && (Mathf.Abs(transform.position.z - target.z) >= radiusNoClick)) this.target = target; // Да кажем, че символът не е на мястото си onPlace = false; > >
public void OnPlaceTrue() onPlace = true; > >
МетодътGetTarget()получава позицията на целта от скриптаMouseCameraи проверява дали е близо до знака. Ако всичко е наред и целта е далече, героят започва да се движи към целта, посредством изчисления, извършени вUpdate(). Методът OnPlaceTrue() се използва, за да покаже на героя, че той е на мястото си. Използва се в малък тригер, който се поставя върху целевия обект.
публичен клас TriggerOnTarget: MonoBehavior
публичен MousePersonplayer;
void OnTriggerEnter(Collider onPlace) player.OnPlaceTrue(); > >
При пресичане на задействащата зона се съобщава, че персонажът е пристигнал на местоназначението си.
В колайдера трябва да посочите, че "това" е тригер, да зададете радиуса (зависи от размера на вашия герой) и да посочите в скрипта символа, от който зависи. Знакът в скрипта има всички настройки по подразбиране и не е необходимо да указвате нищо допълнително. На камерата в скрипта трябва да посочите обект, който действа като мишена, играчът да го контролира и слоя, който ще "хваща" щраквания и върху който ще ходи героят. За тази цел стартирах отделен слой Terrain и го присвоих на обекта, действащ като земя. Това е всичко, опитайте и експериментирайте.
Източници и тестова сцена тук.
Hardcore conf в C++. Каним само професионалисти.
Написа добър текст- получи покана.
Предварителната модерация работи в Sandbox: преди публикуване всички материали преминават през грижовните лъчи на НЛО.
С голяма вероятност те няма да преминат предварителна модерация: