コード:
using UnityEngine;
public class Monster : MonoBehaviour
{
public Transform player;
public float patrolRange = 10f;
public float moveSpeed = 2f;
public float attackRange = 2f;
public float attackInterval = 2f;
public float jumpBackDistance = 3f;
public float healInterval = 5f;
public float healAmount = 10f;
public float healSpeed = 1f;
private Animator animator;
private Rigidbody rigidbody;
private bool isDead = false;
private bool isAttacking = false;
private bool isHealing = false;
private float currentHealth;
private float lastAttackTime = 0f;
private float lastHealTime = 0f;
private void Start()
{
animator = GetComponent<Animator>();
rigidbody = GetComponent<Rigidbody>();
currentHealth = 100f;
}
private void Update()
{
if (isDead)
{
return;
}
float distance = Vector3.Distance(transform.position, player.position);
if (distance <= attackRange)
{
if (Time.time - lastAttackTime >= attackInterval)
{
isAttacking = true;
animator.SetBool("isAttacking", true);
lastAttackTime = Time.time;
}
}
else if (distance <= patrolRange)
{
Vector3 direction = (player.position - transform.position).normalized;
transform.LookAt(player);
transform.position += direction * moveSpeed * Time.deltaTime;
if (!isAttacking)
{
animator.SetBool("isWalking", true);
}
}
else
{
if (!isAttacking)
{
animator.SetBool("isWalking", false);
}
}
if (currentHealth <= 30f && !isHealing)
{
isHealing = true;
animator.SetBool("isHealing", true);
lastHealTime = Time.time;
}
if (isHealing && Time.time - lastHealTime >= healInterval)
{
currentHealth += healAmount * Time.deltaTime * healSpeed;
if (currentHealth >= 100f)
{
currentHealth = 100f;
isHealing = false;
animator.SetBool("isHealing", false);
}
}
}
public void TakeDamage(float damage)
{
if (isDead)
{
return;
}
currentHealth -= damage;
if (currentHealth <= 0f)
{
isDead = true;
animator.SetBool("isDead", true);
rigidbody.isKinematic = true;
Destroy(gameObject, 3f);
}
else if (currentHealth <= 30f && !isHealing)
{
isHealing = true;
animator.SetBool("isHealing", true);
lastHealTime = Time.time;
}
}
public void Attack()
{
float distance = Vector3.Distance(transform.position, player.position);
if (distance <= attackRange)
{
Player playerScript = player.GetComponent<Player>();
if (playerScript != null)
{
playerScript.TakeDamage(10f);
}
}
}
public void JumpBack()
{
Vector3 direction = (transform.position - player.position).normalized;
transform.position += direction * jumpBackDistance;
}
}
手順:
Unity で空のオブジェクトを作成し、そのオブジェクトをモンスターの親にし、次にモンスターのモデルを子にして、スクリプト Monster を子に追加します。
Unity でプレーヤー オブジェクトを作成し、スクリプト Player をオブジェクトに追加します。
Monster スクリプトで、親オブジェクトの Transform コンポーネントをプレーヤー変数に割り当てます。
Monster スクリプトでは、patrolRange、moveSpeed、 AttackRange、 AttackInterval、JumpBackDistance、healInterval、healAmount、healSpeed などのさまざまなパラメータの値を必要に応じて調整します。
Monster スクリプトで、TakeDamage() メソッドを実装します。このメソッドは、攻撃されたときにモンスターの体力を減らすために使用されます。
Player スクリプトで、TakeDamage() メソッドを実装します。これは、攻撃されたときにプレイヤーの体力を減らすために使用されます。
Monster スクリプトでは、Monster が攻撃したときにプレイヤーにダメージを与えるために使用される Attack() メソッドを実装します。
Monster スクリプトで、JumpBack() メソッドを実装します。このメソッドは、モンスターの HP が 30% 未満のときに 3 メートル後方にジャンプするために使用されます。
Monster のアニメーション コントローラーで、4 つのブール パラメーター isWalking、is Attacking、isHealing、isDead を作成し、対応するステート マシンと遷移を作成します。
ゲームを実行し、モンスターのパトロール、追跡、攻撃、血液回復機能をテストします。