¡¡Àè¤Û¤ÉºîÀ®¤·¤¿¸«¤¨¤Ê¤¤Åö¤¿¤êȽÄêÍѤΥץì¥Ï¥Ö¤Ë¥¢¥¿¥Ã¥Á¤·¤ÆÍøÍѤ·¤Þ¤¹¡£
¡¡µ¡Ç½¤È¤·¤Æ¤Ï
¡¦¡ÖÂоݤò¿Ê¹ÔÊý¸þ¤ÈÈ¿ÂЦ¤Ë¥Î¥Ã¥¯¥Ð¥Ã¥¯¤µ¤»¤ë¡×
¡¦¡ÖÂоݤνêÍʪ(¥¢¥¤¥Æ¥à)¤òÍî¤È¤¹(¾å¶õ¤ËÂǤÁ¾å¤²¤ë)¡×
¡¡¤Î£²¤Ä¤Î½èÍý¤ò¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£
¡¡ÂÐ¾Ý¤Ë¤Ï Enemy ¥¯¥é¥¹¡¢¥×¥ì¥¤¥ä¡¼¤Ë¤Ï PlayerController ¥¯¥é¥¹¡¢¥¢¥¤¥Æ¥à¤Ë¤Ï ItemBase ¥¯¥é¥¹¤¬¥¢¥¿¥Ã¥Á¤µ¤ì¤Æ¤¤¤ëÁ°Äó¤Ç¤¹¡£
HitController.cs
¡¡<=¡¡¥¯¥ê¥Ã¥¯¤¹¤ë¤È³«¤¤Þ¤¹
using UnityEngine;
/// <summary>
/// ¹¶·â¤Î¥ª¡¼¥Ê¡¼¤Î¼ïÎà
/// </summary>
public enum OwnerType
{
Player,
Enemy
}
public class HitController : MonoBehaviour
{
[SerializeField]
private float knockbackPower = 5.0f;¡¡¡¡// ¥Î¥Ã¥¯¥Ð¥Ã¥¯¤µ¤»¤ëÎÏ
[SerializeField]
private OwnerType ownerType;¡¡¡¡¡¡¡¡¡¡¡¡// ¥¢¥¤¥Æ¥à¤Î½êͼÔ
[SerializeField]
private float forcePower = 1000.0f;¡¡¡¡ // ¥¢¥¤¥Æ¥à¤òÍî¤È¤¹ºÝ¤ÎÎÏ
private float range = 3.0f;
private float height = 2.0f;
/// <summary>
/// ½é´üÀßÄê
/// </summary>
/// <param name="ownerType"></param>
public void SetUpOwner(OwnerType ownerType) {
this.ownerType = ownerType;
}
private void OnTriggerEnter(Collider other)
{
Debug.Log(other.gameObject.name);
// ¤³¤³¤Ë½ñ¤¯¤ÈÀè¤Ë¥¢¥¤¥Æ¥à¤òÍî¤È¤¹
JedgeKnockBackItem(other.transform);
// ¤³¤Î¹¶·â¤Î¥ª¡¼¥Ê¡¼¤¬¥×¥ì¥¤¥ä¡¼¤Ç¡¢¹¶·âÂоݤ¬Å¨¤Ê¤é
if (ownerType == OwnerType.Player && other.TryGetComponent(out Enemy enemy)) {
// Ũ¤ò¥Î¥Ã¥¯¥Ð¥Ã¥¯
KnockbackTarget(enemy.transform);
// Ũ¤Î¥¹¥Æ¡¼¥ÈÊѹ¹¡£¹ç¤ï¤»¤Æ°ÜÆ°Ää»ß¤µ¤»¤ë
enemy.PrepareChangeState(EnemyState.STOP, 2.0f);
}
// ¤³¤Î¹¶·â¤Î¥ª¡¼¥Ê¡¼¤¬Å¨¤Ç¡¢¹¶·âÂоݤ¬¥×¥ì¥¤¥ä¡¼¤Ê¤é
else if (ownerType == OwnerType.Enemy && other.TryGetComponent(out PlayerController player)) {
// ¥×¥ì¥¤¥ä¡¼¤ò¥Î¥Ã¥¯¥Ð¥Ã¥¯
KnockbackTarget(player.transform);
}
// ¤³¤³¤Ë¥¢¥¤¥Æ¥à¤òÍî¤È¤¹½èÍý¤ò½ñ¤¯¤È¡¢¥Î¥Ã¥¯¥Ð¥Ã¥¯¸å¤Ë¥¢¥¤¥Æ¥à¤òÍî¤È¤¹
¡¡¡¡¡¡¡¡// ÂоݤΰÌÃÖ¤«¤é¥¢¥¤¥Æ¥à¤¬¥Î¥Ã¥¯¥Ð¥Ã¥¯¤¹¤ë¤Î¤Ç¡¢Íî¤È¤·¤¿Áê¼ê¤¬¥¢¥¤¥Æ¥à¤ò½¦¤¤¤ä¤¹¤¯¤Ê¤ë
//JedgeKnockBackItem(other.transform);
}
/// <summary>
/// Æù¤ò»ý¤Ã¤Æ¤¤¤ë¤«È½Äê
/// </summary>
/// <param name="target"></param>
private void JedgeKnockBackItem(Transform target) {
// GetChild ¥á¥½¥Ã¥É¤È for ʸ¤òÁȤ߹ç¤ï¤»¤Æ Radar ¤ò¸«¤Ä¤±¤ë
// »Ò¥ª¥Ö¥¸¥§¥¯¥È¤Î¿ô¤ò¸ÇÄê²½¤·¤Ê¤¤¤Î¤Ç¡¢Å¨¤Ç¤â¥×¥ì¥¤¥ä¡¼¤Ç¤âÌäÂê¤Ê¤¯Æ°¤¯
for (int i = 0; i < target.childCount; i++) {
if (target.GetChild(i).TryGetComponent(out ItemBase item) == true) {
// ¥¢¥¤¥Æ¥à¤ò¥É¥í¥Ã¥×
item.Drop();
Debug.Log("¥¢¥¤¥Æ¥àÍî¤È¤·¤ËÀ®¸ù¡ª");
// ¥¢¥¤¥Æ¥à¼«ÂΤò¥Î¥Ã¥¯¥Ð¥Ã¥¯
KnockbackItem(item);
break;
}
}
}
/// <summary>
/// ¥¢¥¤¥Æ¥à¤Î¥Î¥Ã¥¯¥Ð¥Ã¥¯
/// </summary>
/// <param name="item"></param>
private void KnockbackItem(ItemBase item)
{
// ¥¢¥¤¥Æ¥à¤ò¥é¥ó¥À¥à¤Ë¿á¤Èô¤Ð¤¹
if (radar.gameObject.TryGetComponent(out Rigidbody rb)) {
rb.AddForce(new Vector3(Random.Range(-range, range), height, Random.Range(-range, range)) * forcePower);
}
}
/// <summary>
/// Âоݤò¥Î¥Ã¥¯¥Ð¥Ã¥¯
/// Ũ¤ä¥×¥ì¥¤¥ä¡¼¡¢¤È¤¤¤¦É÷¤ËÂоݤò¸ÇÄê²½¤»¤º¡¢°ú¿ô¤Ç¤â¤é¤Ã¤¿¾ðÊó¤ò¥Î¥Ã¥¯¥Ð¥Ã¥¯¤ÎÂоݤȤ¹¤ë
/// </summary>
/// <param name="target"></param>
private void KnockbackTarget(Transform target)
{
// Âоݤò¿á¤Èô¤Ð¤¹Êý¸þ(°ÜÆ°¤·¤Æ¤¤¿È¿ÂÐÊý¸þ)¤òÀßÄê
Vector3 direction = (target.transform.position - transform.position).normalized;
// ¹â¤µ¤òÄ´À°
direction = new(direction.x, 0, direction.z);
// Âоݤò¿á¤Èô¤Ð¤¹
target.position += direction * knockbackPower;
}
}
¥³¥á¥ó¥È¤ò¤«¤¯