Sample project to showcase the use of UI Toolkit for Runtime based on the Unity Royale project.
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

123 行
3.2 KiB

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UIElements;
namespace UnityRoyale
{
public class ThinkingPlaceable : Placeable
{
[HideInInspector] public States state = States.Dragged;
public enum States
{
Dragged, //when the player is dragging it as a card on the play field
Idle, //at the very beginning, when dropped
Seeking, //going for the target
Attacking, //attack cycle animation, not moving
Dead, //dead animation, before removal from play field
}
[HideInInspector] public AttackType attackType;
public enum AttackType
{
Melee,
Ranged,
}
[HideInInspector] public ThinkingPlaceable target;
[HideInInspector] public HealthBar healthBar;
[HideInInspector] public float hitPoints;
[HideInInspector] public float attackRange;
[HideInInspector] public float attackRatio;
[HideInInspector] public float lastBlowTime = -1000f;
[HideInInspector] public float damage;
[HideInInspector] public AudioClip attackAudioClip;
[HideInInspector] public float timeToActNext = 0f;
//Inspector references
[Header("Projectile for Ranged")]
public GameObject projectilePrefab;
public Transform projectileSpawnPoint;
private Projectile projectile;
public UnityAction<ThinkingPlaceable> OnDealDamage, OnProjectileFired;
public virtual void SetTarget(ThinkingPlaceable t)
{
target = t;
t.OnDie += TargetIsDead;
}
public virtual void StartAttack()
{
state = States.Attacking;
}
public virtual void DealBlow()
{
lastBlowTime = Time.time;
}
//Animation event hooks
public void DealDamage()
{
if(OnDealDamage != null)
OnDealDamage(this);
}
public void FireProjectile()
{
if(OnProjectileFired != null)
OnProjectileFired(this);
}
public virtual void Seek()
{
state = States.Seeking;
}
protected void TargetIsDead(Placeable p)
{
//Debug.Log("My target " + p.name + " is dead", gameObject);
state = States.Idle;
target.OnDie -= TargetIsDead;
timeToActNext = lastBlowTime + attackRatio;
}
public bool IsTargetInRange()
{
return (transform.position-target.transform.position).sqrMagnitude <= attackRange*attackRange;
}
public float SufferDamage(float amount)
{
hitPoints -= amount;
//Debug.Log("Suffering damage, new health: " + hitPoints, gameObject);
if(state != States.Dead
&& hitPoints <= 0f)
{
Die();
}
return hitPoints;
}
public virtual void Stop()
{
state = States.Idle;
}
protected virtual void Die()
{
state = States.Dead;
if(OnDie != null)
OnDie(this);
}
}
}