Введение в разработку на игровом движке Unity — практикум. Часть 3.
Простое управление персонажем на основе компонента Character Controller. Работа с устройствами ввода. Что такое класс Input и оси управления и их использование для перемещения, поворота персонажа и прочих элементов управления.
Что такое Raycast и его использование на примере стрельбы. Использование информации о точке пересечения Raycast с объектом для добавления декалей и применения физической силы к игровым объектам. Добавление звуков в игру. Анимации, атака и смерть зомби.
Скрипт героя:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
using UnityEngine; using System.Collections; public class HeroController : MonoBehaviour { public Animator animator; public CharacterController controller; public Gun gun; public float speed = 3f; public float rotateSpeed = 180f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { float v = Input.GetAxis ("Vertical"); float h = Input.GetAxis ("Mouse X"); Vector3 offset = Vector3.zero; if (Input.GetMouseButtonUp (0)) { gun.shoot (); animator.SetBool ("shoot", true); } else { animator.SetBool ("shoot", false); } if (controller.isGrounded) { if(v != 0) { offset = transform.forward * v * speed * Time.deltaTime; animator.SetBool("walk", true); } else { animator.SetBool("walk", false); } if(h != 0) { transform.Rotate(transform.up * h * rotateSpeed * Time.deltaTime); } } offset += Physics.gravity * Time.deltaTime; controller.Move (offset); } void damage() { //TODO } } |
Скрипт зомби:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
using UnityEngine; using System.Collections; public class EnemyController : MonoBehaviour { public NavMeshAgent agent; public Animator animator; private Transform player; // Use this for initialization void Start () { player = GameObject.FindGameObjectWithTag ("Player").transform; StartCoroutine (findPath ()); StartCoroutine (detectPlayer ()); } IEnumerator detectPlayer() { while (true) { if(player == null) break; if(Vector3.Distance(transform.position, player.position) < 1f) { attack(); break; } yield return new WaitForSeconds(.5f); } } IEnumerator findPath() { while (true) { if(player != null) agent.SetDestination (player.position); else break; yield return new WaitForSeconds(2f); } } public void damage() { animator.SetTrigger ("dead"); Destroy (gameObject, 3f); enabled = false; } void attack() { animator.SetBool ("attack", true); player.gameObject.BroadcastMessage ("damage"); } // Update is called once per frame void Update () { } } |
Скрипт оружия:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
using UnityEngine; using System.Collections; public class Gun : MonoBehaviour { public GameObject decal; public float forceShoot = 100f; public float waitTime = .3f; public AudioSource source; public AudioClip clip; private float _wait = 0; public void shoot() { if (_wait > 0) return; _wait = waitTime; source.PlayOneShot (clip); RaycastHit hit; Camera cam = Camera.main; if (Physics.Raycast (cam.transform.position, cam.transform.forward, out hit)) { if(hit.collider.tag == "Enemy") { hit.transform.gameObject.SendMessage("damage"); } else { Rigidbody rigidBody = hit.transform.GetComponent<Rigidbody>(); if(rigidBody != null) { rigidBody.AddForceAtPosition(-hit.normal * forceShoot, hit.point); } GameObject obj = Instantiate<GameObject>(decal); obj.transform.position = hit.point + hit.normal * .1f; obj.transform.rotation = Quaternion.LookRotation(-hit.normal); obj.transform.SetParent(hit.transform); } } } void Update() { if (_wait > 0) _wait -= Time.deltaTime; } } |
Ресурсы, используемые в видео, можно скачать по ссылке
Unity можно получить здесь
8 комментариев
Я заметил что в скрипте с зобми и героем ,некоторые слова на видео и на сайте поменяли. Но главное работает.
И почему персонаж, ходит задом наперед, жмешь в перед идет назад и также противоположным нажатием?
Добрый день, встретился с такой ошибкой, зомби не хочет атаковать пока включен капсул колайдер. Просто не переходит с ходьбы на атаку
Почему анимация ходьбы не срабатывает, у персонажа Idle анимация постоянно! Если убрать галочку с Has Exit Time, то работает, но срабатывание не моментальное, и долго останавливается! Как это исправить? Пожалуйста помоги!
Добрый день, Иван!
Я недавно нашел Ваш зомби шутер.
И сегодня добрался до оружия.
У меня проблема с 38 строкой
obj.transform.rotation = Quaternion.LookRotation(-hit.normal);
Ошибка CS0029 Не удается неявно преобразовать тип «UnityEngine.Quaternion» в «UnityEngine.Vector3».
С уважением, Владимир
Извини, где были мои глаза и руки!?
Прошло нормально. Была ошибка при наборе скрипта!
У меня проблема, когда персонаж идет у него камера при повороте наклоняет персонажа, что делать?
у меня isGrounded всегда false и игрок всегда висит в воздухе, а зомби если запустить игру опускается на землю. как можно игрока исправить?