発射した弾がどこかに当たるたびに、その後敵に当たったときのダメージを小さくしてみます。
敵の体のボーンに付けたスクリプトで、インスペクタで設定したダメージと弾の威力をかけて、実際に敵が受けるダメージを計算します。跳ねるたびに弾の威力の値を下げることでダメージを小さくします。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletScript : MonoBehaviour
{
public float[] power;
// Start is called before the first frame update
void Start()
{
power = new float[2] { 1f,1f};
}
private void OnCollisionEnter(Collision collision)
{
power[1] = power[0];
power[0] *= 0.5f;
}
}
弾のスクリプトでは、弾が衝突したときに威力を半分にしています。威力は要素数2の配列になっていて、衝突すると、2番目の値に最初の値を代入してから、最初の値を半分にします。
そして、敵のダメージ計算には2番目の値を使います。最初の値を使うと、弾が直接敵に当たったときも威力が半分になってしまいます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyBodyScript : MonoBehaviour
{
AgentAttackTest sc_agent;
[SerializeField][Range(0f,1f)] float damage = 0.1f;
private void Start()
{
sc_agent = transform.root.GetComponent<AgentAttackTest>();
}
private void OnCollisionEnter(Collision collision)
{
if (collision.collider.tag == "Weapon" && collision.collider.gameObject != sc_agent.collidedObject)
{
float d = damage;
BulletScript b = collision.gameObject.GetComponent<BulletScript>();
if (b)
{
d *= b.power[1];
}
sc_agent.SetHP(-d);
sc_agent.collidedObject = collision.collider.gameObject;
sc_agent.Display(d, gameObject.name);
}
}
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Weapon")
{
sc_agent.SetHP(-damage);
sc_agent.collidedObject = other.gameObject;
}
}
}
武器に銃弾のスクリプトが付いていないときは、衝突時のGetComponentの値はNullになるので、インスペクタのダメージの値がそのまま使われます。
GIF画像では、直接当たるとダメージは0.2、1回跳ねた跳弾のダメージは0.1、2回跳ねると0.05と、跳ねるたびにダメージが半分になっています。