RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1583355
Accepted
Nemo
Nemo
Asked:2024-06-10 02:29:45 +0000 UTC2024-06-10 02:29:45 +0000 UTC 2024-06-10 02:29:45 +0000 UTC

如何检查Unity C#标签

  • 772

射击时,发射光束,当它用碰撞器击中任何物体时,它会在我的例子中产生击中效果,子弹的痕迹,我需要确保当我击中带有Person标签的物体时,血液效果会产生然后消失,我不明白这是怎么回事,希望对您有所帮助。

下面是游戏的射击代码在Unity引擎上的实际实现。

using System.Collections;
using UnityEngine;

public class Weapon : MonoBehaviour
{
    public float damage = 21f;
    public float fireRate = 1f;
    public float force = 155f;
    public float range = 15f;
    public ParticleSystem hitFlash;
    public ParticleSystem muzzleFlash;
    public Transform bulletSpawn;
    public AudioClip shotSFX;
    public AudioSource _audioSource;
    public GameObject hitEffect;
    public GameObject Gilza;
    public float GilzaForce = 5f;

    public Camera _cam;
    private float nextFire = 0f;
    public GameObject BloodEffect;


    void Update()
    {
        if (Input.GetButton("Fire1") && Time.time > nextFire)
        {
            nextFire = Time.time + 1f / fireRate;
            Shoot();
            GilzaF();
        }
    }

    void Shoot()
    {
        
          
        _audioSource.PlayOneShot(shotSFX);
        muzzleFlash.Play();

        RaycastHit hit;

        if (Physics.Raycast(_cam.transform.position,_cam.transform.forward,out hit,range))
        {
            Debug.Log("Попадание в обьект "+ hit.collider);

        

            
            GameObject impact = Instantiate(hitEffect, hit.point, Quaternion.LookRotation(hit.normal));
            

            if(hit.rigidbody !=null)
            {
                 hit.rigidbody.AddForce(-hit.normal * force);
            }
        }
    }

void GilzaF()
{
     Instantiate(Gilza,bulletSpawn.position, bulletSpawn.rotation);
     {  
         Gilza.GetComponent<Rigidbody>().AddForce(bulletSpawn.forward * GilzaForce, ForceMode.Impulse);
     }
     
}
c#
  • 1 1 个回答
  • 37 Views

1 个回答

  • Voted
  1. Best Answer
    Yaroslav
    2024-06-10T04:07:41Z2024-06-10T04:07:41Z

    汤必须与苍蝇隔离。商业行为逻辑、视觉和管理应该是不同的类。

    该班级Weapon必须只负责射击,而不负责其他任何事情。这里值得使用协程。

    public class Weapon : MonoBehaviour
    {
        public event Action Shot;
        public event Action<RaycastHit> OnHit;
    
        [SerializeField] private float _damage = 21f;
        [SerializeField] private float _fireRate = 1f;
        [SerializeField] private float _distance = 15f;
        [SerializeField] private float _pushPower = 15f;
        [Space]
        [SerializeField] private Transform _firePoint;
    
        private IEnumerator _shootProcess;
        private bool _attack;
    
        public void StartShoot ()
        {
            _attack = true;
            if (_shootProcess != null)
                return;
            _shootProcess = ShootProcess();
            StartCoroutine(_shootProcess);
        }
    
        public void StopShoot ()
        {
            _attack = false;
        }
    
        private IEnumerator ShootProcess ()
        {
            while (_attack)
            {
                Fire();
                yield return new WaitForSeconds(_fireRate); 
            }
            _shootProcess = null;
        }
    
        private void Fire ()
        {
            if (Physics.Raycast(_firePoint.position, _firePoint.forward, out RaycastHit hit, _distance))
            {
                GameObject target = hit.collider.gameObject;
                if (target.TryGetComponent(out IDamagable dTarget))
                    dTarget.ApplyDamage(_damage);
                if (_pushPower > 0 && target.TryGetComponent(out Rigidbody body))
                    body.AddForce(-hit.normal * _pushPower);
                OnHit?.Invoke(hit);
            }
            Shot?.Invoke();
        }
    }
    

    视觉对象可以通过事件接收回调。根本不使用标签,因为它是一个字符串文字,您可能会在其中犯错误,很难找到错误并且很难更改某些内容。

    有了水平仪的几何形状,一切都很简单,用零件贴花。至于其他物体被击中的反应,这不是武器的问题,而是子弹流血的问题!目标可以喷出血液、飞溅、水坑等,但原因可以是任何东西,子弹、尖刺、重击和钝击,颜色可以从红色到灰棕色,或者不喷出任何东西,因为它是一些那种骷髅不流血,只是吐骨头碎片。在这方面,对伤害的反应应该是目标本身的责任,其组件之一,最好是在某种界面下,因为可以有许多不同的界面,不仅对于单位,而且对于装饰品。

    [RequireComponent(typeof(Weapon))]
    public class WeaponView : MonoBehaviour
    {
        [SerializeField] private ParticleSystem _muzzleFlash;
        [SerializeField] private AudioSource _audio;
        [Space]
        [SerializeField] private Transform _sleevePoint;
        [SerializeField] private GameObject _sleeveTemplate;
        [SerializeField] private float _sleeveForce = 5;
        [Space]
        [SerializeField] private GameObject _decalTemplate;
        private Weapon _weapon;
    
        private void OnEnable ()
        {
            _weapon = GetComponent<Weapon>();
            _weapon.Shot += OnShot;
            _weapon.OnHit += OnHit;
        }
    
        private void OnDisable ()
        {
            _weapon.Shot -= OnShot;
            _weapon.OnHit -= OnHit;
        }
    
        private void OnShot ()
        {
            _muzzleFlash?.Play();
            _audio?.PlayOneShot(_audio.clip);
            SpawnSleeve();
        }
    
        private void OnHit (RaycastHit hit)
        {
            if (hit.collider.gameObject.GetComponent<Rigidbody>() == false)
                OnHitGeometry(hit);
            if (hit.collider.gameObject.TryGetComponent(out IHitReaction target))
                target.Hit(hit.point, -hit.normal);
        }
    
        private void SpawnSleeve ()
        {
            var sleeve = Instantiate(_sleeveTemplate, _sleevePoint.position, _sleevePoint.rotation);
            if (sleeve.TryGetComponent(out Rigidbody body))
                body.AddForce(sleeve.transform.forward * _sleeveForce);
        }
    
        private void OnHitGeometry (RaycastHit hit)
        {
            Instantiate(_decalTemplate, hit.point, Quaternion.LookRotation(hit.normal));
        }
    }
    
    • 1

相关问题

  • 使用嵌套类导出 xml 文件

  • 分层数据模板 [WPF]

  • 如何在 WPF 中为 ListView 手动创建列?

  • 在 2D 空间中,Collider 2D 挂在玩家身上,它对敌人的重量相同,我需要它这样当它们碰撞时,它们不会飞向不同的方向。统一

  • 如何在 c# 中使用 python 神经网络来创建语音合成?

  • 如何知道类中的方法是否属于接口?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5