我的 raycast 在 Unity 3D 中没有激活我的敌人死亡

Posted

技术标签:

【中文标题】我的 raycast 在 Unity 3D 中没有激活我的敌人死亡【英文标题】:My raycast is not activating my enemies death in Unity 3D 【发布时间】:2020-12-11 12:23:34 【问题描述】:

我一直试图让我的敌人在生命值为零时倒下。 所以我做了一个伤害变量。伤害会减去生命值,当它达到零或更低时,他应该变成布娃娃。但看起来他一开始并没有死..

在枪脚本中:

using UnityEngine;

public class gun : MonoBehaviour


    public float damage = 10f;
    public float range = 100f;

    public Camera Cam;

    void Update()
    
        if (Input.GetButtonDown("Fire1"))
        
            Fire();
        
        
        void Fire()
        
            RaycastHit hit;
            if(Physics.Raycast(Cam.transform.position, Cam.transform.forward, out hit, range))
            
                Debug.Log(hit.transform.name);
                
                Enemy enemy = hit.transform.GetComponent<Enemy>();
                if (enemy != null)
                
                    enemy.damage(damage);
                
            
        
    

现在在敌人脚本中:

using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;

public class Enemy : MonoBehaviour

    Animator myAnim;

    List<Rigidbody> ragdollRigids;



    public float health = 100f;
    public void damage (float amount)
    
        health -= amount;
        if(health <= 0)
        
            Death();
        
    

    void Death()
    
        activateRagdoll();
    

    //Update

    void Start()
    
        myAnim = GetComponent<Animator>();
        ragdollRigids = new List<Rigidbody>(transform.GetComponentsInChildren<Rigidbody>());
        ragdollRigids.Remove(GetComponent<Rigidbody>());
        DeactivateRagdoll();
       
    

    
    void Update()
    
        
    


    //Ragdoll dependencies.

    public void activateRagdoll()
    
        myAnim.enabled = false;
        for (int i = 0; i < ragdollRigids.Count; i++)
        
            ragdollRigids[i].useGravity = true;
            ragdollRigids[i].isKinematic = false;
        
    

    public void DeactivateRagdoll()
    
        myAnim.enabled = true;
        for (int i = 0; i < ragdollRigids.Count; i++)
        
            ragdollRigids[i].useGravity = false;
            ragdollRigids[i].isKinematic = true;
        
    

提前谢谢你。 :)

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

解决方案

您的变量(damageamount)名称不同,但用途相同。我已经编辑了你的代码。 应该没有错误。如果有,请联系我对我的回答发表评论。

代码

枪:

using UnityEngine;

public class gun : MonoBehaviour


    public float damage = 10f;
    public float range = 100f;

    public Camera Cam;

    void Update()
    
        if (Input.GetButtonDown("Fire1"))
        
            Fire();
        
        
        void Fire()
        
            RaycastHit hit;
            if(Physics.Raycast(Cam.transform.position, Cam.transform.forward, out hit, range))
            
                Debug.Log(hit.transform.name);
                
                Enemy enemy = hit.transform.GetComponent<Enemy>();
                if (enemy != null)
                
                    enemy.damage(damage);
                
            
        
    

敌人:

using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;

public class Enemy : MonoBehaviour

    Animator myAnim;

    List<Rigidbody> ragdollRigids;



    public float health = 100f;
    public void damage (float damage)
    
        health -= damage;
        if(health <= 0)
        
            Death();
        
    

    void Death()
    
        activateRagdoll();
    

    //Update

    void Start()
    
        myAnim = GetComponent<Animator>();
        ragdollRigids = new List<Rigidbody>(transform.GetComponentsInChildren<Rigidbody>());
        ragdollRigids.Remove(GetComponent<Rigidbody>());
        DeactivateRagdoll();
       
    

    
    void Update()
    
        
    


    //Ragdoll dependencies.

    public void activateRagdoll()
    
        myAnim.enabled = false;
        for (int i = 0; i < ragdollRigids.Count; i++)
        
            ragdollRigids[i].useGravity = true;
            ragdollRigids[i].isKinematic = false;
        
    

    public void DeactivateRagdoll()
    
        myAnim.enabled = true;
        for (int i = 0; i < ragdollRigids.Count; i++)
        
            ragdollRigids[i].useGravity = false;
            ragdollRigids[i].isKinematic = true;
        
    

【讨论】:

这行得通吗?如果确实如此,请接受我的回答,以便我知道它有效 - 它也对社区有所帮助!双赢。如果它不起作用,请通过评论告诉我,以便我可以进一步帮助您。 @GUESTAS 谢谢,它说的是:当前上下文中不存在名称'amount'。 我将编辑我拥有的代码/答案。尝试使用新代码。如果仍然有任何错误,请与我联系。没有错误? - 接受。 哦,不,那没有用,我担心。也许它与我分配敌人脚本的位置有关?我将它分配给了 swat 预制件,但它有:swat > geo,然后是布娃娃碎片。但问题是我不能将动画师分配给“geo”。 我可以尝试,但那样会消除我想要的效果...我应该尝试吗?

以上是关于我的 raycast 在 Unity 3D 中没有激活我的敌人死亡的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D:弹跳/反射Raycast

Unity3d - 当场景中有多个 Collier 时,Raycast 不计算命中

unity获取raycast的XYZ

如何创建自己的 Raycast 组件,它不需要碰撞器,但在 C# Unity3D 中支持 Skinned Mesh Renderer?

Unity3D 灵巧小知识点 ☀️ | 快速查找场景中勾选Raycast Target的游戏对象

Raycast 不在电话上工作,但在 Unity 编辑器上工作