50 lines
2.0 KiB
C#
50 lines
2.0 KiB
C#
using UnityEngine;
|
|
|
|
namespace Weapons
|
|
{
|
|
public class BotShooter : MonoBehaviour
|
|
{
|
|
[SerializeField] private GameObject firePoint;
|
|
[SerializeField] private ParticleSystem projectilePrefab;
|
|
private NPC _myNpc;
|
|
private MovementController _moveCtrl;
|
|
private AudioSource _audioSource;
|
|
|
|
private void Awake()
|
|
{
|
|
_myNpc = GetComponent<NPC>();
|
|
_moveCtrl = GetComponent<MovementController>();
|
|
_audioSource = GetComponent<AudioSource>();
|
|
}
|
|
|
|
public void BotShoot()
|
|
{
|
|
if (Physics.Raycast(firePoint.transform.position,
|
|
firePoint.transform.forward, out var hit,
|
|
SettingsReader.Instance.GetSettings.ViewDistance))
|
|
{
|
|
if (hit.transform.TryGetComponent<ICharacter>(out var target))
|
|
{
|
|
print($"did damage to {hit.transform.name}");
|
|
_audioSource.Play();
|
|
Instantiate(projectilePrefab, firePoint.transform.position, firePoint.transform.rotation);
|
|
var mySpeed = _moveCtrl.Velocity.magnitude;
|
|
var enemySpeed = 0f;
|
|
var inCover = false;
|
|
if (target.GetCharacter.TypeAi == TypeAI.HumanAI)
|
|
enemySpeed = hit.rigidbody.velocity.magnitude;
|
|
else
|
|
{
|
|
enemySpeed = hit.collider.GetComponent<MovementController>().Velocity.magnitude;
|
|
inCover = hit.collider.GetComponent<NPC>().NpcState.InCover;
|
|
}
|
|
|
|
var hitChance = (1 - 0.5 * mySpeed) * (1 - 0.5 * enemySpeed + 0.5*inCover.ToInt()) / 1.5f;
|
|
if (!(Random.Range(0f, 1f) < hitChance)) return;
|
|
_myNpc.AddReward(0.05f);
|
|
target.GetDamage(SettingsReader.Instance.GetSettings.RifleDamage);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |