Код на C# Unity. Контроллёр 3D персонажа (ходьба, бег, прыжок и присед)
Для создания контроллера 3D персонажа в Unity мы можем использовать стандартные компоненты контроллера персонажа и аниматора. Для начала необходимо добавить к персонажу компонент Character Controller и Rigidbody. Затем необходимо создать анимационный контроллер, который будет управлять персонажем.
Для того, чтобы определить состояния анимационного контроллера и точки перехода между ними, мы можем использовать триггеры, которые будут установлены в зависимости от состояния персонажа. Например, для ходьбы мы можем создать состояние Walk, а для бега – Run. Переход между ними необходимо настроить с помощью триггеров.
Для прыжка и приседания мы также должны создать соответствующие состояния и переходы между ними.
Пример кода для контроллера 3D персонажа:
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float moveSpeed = 5f;
public float jumpForce = 10f;
public float gravityScale = 1f;
public Animator animator;
public Transform groundCheck;
public float groundDistance = 0.2f;
public LayerMask groundMask;
private CharacterController characterController;
private Vector3 moveDirection;
private bool isGrounded = false;
private void Start()
{
characterController = GetComponent<CharacterController>();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
moveDirection.y = jumpForce;
animator.SetTrigger("Jump");
}
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
moveDirection = new Vector3(horizontal, 0f, vertical).normalized;
if (moveDirection.magnitude > 0)
{
animator.SetBool("Walk", true);
transform.rotation = Quaternion.LookRotation(moveDirection);
}
else
{
animator.SetBool("Walk", false);
}
if (Input.GetKey(KeyCode.LeftShift))
{
moveSpeed = 10f;
animator.SetBool("Run", true);
}
else
{
moveSpeed = 5f;
animator.SetBool("Run", false);
}
moveDirection.y += Physics.gravity.y * gravityScale * Time.deltaTime;
isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);
if (isGrounded && moveDirection.y < 0)
{
moveDirection.y = -2f;
}
characterController.Move(moveDirection * moveSpeed * Time.deltaTime);
}
}
Враги и взаимодействие с ними
Для создания врагов и взаимодействия с ними в Unity мы можем использовать простой скрипт, который определяет поведение врага и его способности.
Пример кода для врага:
using UnityEngine;
public class EnemyController : MonoBehaviour
{
public float moveSpeed = 5f;
public float attackRange = 1f;
public float attackDamage = 10f;
public float attackRate = 2f;
public Transform attackPoint;
public LayerMask playerLayer;
private Transform playerTransform;
private Animator animator;
private float nextAttackTime = 0f;
private void Start()
{
playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
animator = GetComponent<Animator>();
}
private void Update()
{
if (Vector3.Distance(transform.position, playerTransform.position) <= attackRange)
{
if (Time.time >= nextAttackTime)
{
Attack();
nextAttackTime = Time.time + 1f / attackRate;
}
}
else
{
Vector3 direction = playerTransform.position - transform.position;
direction.y = 0f;
transform.rotation = Quaternion.LookRotation(direction);
animator.SetBool("Walk", true);
transform.position += direction.normalized * moveSpeed * Time.deltaTime;
}
}
private void Attack()
{
animator.SetTrigger("Attack");
Collider[] players = Physics.OverlapSphere(attackPoint.position, attackRange, playerLayer);
foreach (Collider playerCollider in players)
{
playerCollider.GetComponent<PlayerHealth>().TakeDamage(attackDamage);
}
}
}
Механика здоровья
Механика здоровья в Unity может быть реализована с помощью простого скрипта, который отслеживает количество здоровья персонажа и его состояние.
Пример кода для механики здоровья:
using UnityEngine;
using UnityEngine.UI;
public class PlayerHealth : MonoBehaviour
{
public float maxHealth = 100f;
private float currentHealth;
private bool isDead = false;
public Image healthBar;
private void Start()
{
currentHealth = maxHealth;
healthBar.fillAmount = currentHealth / maxHealth;
}
public void TakeDamage(float damage)
{
if (isDead)
{
return;
}
currentHealth -= damage;
healthBar.fillAmount = currentHealth / maxHealth;
if (currentHealth <= 0)
{
isDead = true;
Die();
}
}
private void Die()
{
// Выполняем необходимые действия при смерти игрока
}
}
Смерть и возрождение
Для реализации смерти и возрождения в Unity мы можем использовать простой скрипт, который отслеживает состояние персонажа и выполняет нужные действия при смерти.
Пример кода для смерти и возрождения:
using UnityEngine;
using UnityEngine.SceneManagement;
public class PlayerLifeCycle : MonoBehaviour
{
public GameObject deathEffect;
public float respawnTime = 5f;
private bool isDead = false;
public void Die()
{
if (isDead)
{
return;
}
isDead = true;
Instantiate(deathEffect, transform.position, transform.rotation);
StartCoroutine(Respawn());
}
private IEnumerator Respawn()
{
yield return new WaitForSeconds(respawnTime);
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}
Этот скрипт отслеживает состояние персонажа и при смерти создает эффект смерти и запускает сопрограмму, которая выполняет перезагрузку уровня через время respawnTime.