【问题标题】:Unity how do I make my gun stop shooting when the Player is moving?Unity如何让我的枪在玩家移动时停止射击?
【发布时间】:2019-07-27 05:46:25
【问题描述】:

我正在制作一个射击脚本,但是我不知道如何在播放器运行时禁用射击。有人可以帮我吗?

void Shoot()
{
    MuzzleFlash.Play();


    RaycastHit hit;
    if (Physics.Raycast(cam.transform.position, cam.transform.forward, out hit, Range))
    {
        Debug.Log(hit.transform.name);

        EnemyHealth enemy = hit.transform.GetComponent<EnemyHealth>();
        if (enemy != null)
        {
            enemy.TakeDamage(Damage);
        }

    }
}

这是我的角色控制器脚本的移动部分:

void Movement()
{
    transform.Translate(Vector3.forward * Input.GetAxis("Vertical") * WalkSpeed * Time.deltaTime);
    transform.Translate(Vector3.right * Input.GetAxis("Horizontal") * WalkSpeed * Time.deltaTime);

    if (Input.GetKeyDown(KeyCode.LeftShift))
    {
        WalkSpeed = RunSpeed;
    }
    if (Input.GetKeyUp(KeyCode.LeftShift))
    {
        WalkSpeed = DefaultSpeed;
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您可以像这样在其他脚本中设置变量:

    [Serialize Field]
    private GameObject objectWithYourScriptYouNeed; 
    private ClassOfScriptYouNeed pS; 
    
    
    void Start()
    {     
        pS = objectWithYourScript.GetComponent<ClassOfScriptYouNeed>();    
        pS.varName = 12345;
    }
    

    所以,在你的拍摄脚本中:

    Public Bool isMoving;
    
    void Shoot()
    {
        //I'm assuming you also dont want muzzleflash to play.
        if (isMoving != true)
        {
            MuzzleFlash.Play();    
    
            RaycastHit hit;
            if (Physics.Raycast(cam.transform.position, cam.transform.forward, out hit, Range))
            {
    
                Debug.Log(hit.transform.name);
    
                EnemyHealth enemy = hit.transform.GetComponent<EnemyHealth>();
                if (enemy != null)
                {
                    enemy.TakeDamage(Damage);
                }
            }
        }
    }
    

    你的动作脚本:

    //put your shooting scripts name below.
    private ShootScript shootScript; 
    
    void start()
    {    
    
        shootScript = GetComponent<ShootScript>();
    
    }
    
    void Movement()
    {
        shootScript.isMoving = Input.GetAxis("Vertical") != 0f 
                               || Input.GetAxis("Horizontal") != 0f ; 
    
        transform.Translate(Vector3.forward * Input.GetAxis("Vertical") 
                            * WalkSpeed * Time.deltaTime);
        transform.Translate(Vector3.right * Input.GetAxis("Horizontal") 
                            * WalkSpeed * Time.deltaTime);
    
        // GetKey is true on every frame that shift is held down, and false when it isn't
        // GetKeyDown is only true on the first frame in a row that shift is held down    
        if (Input.GetKey(KeyCode.LeftShift))
        {
            WalkSpeed = RunSpeed;
        }
        else 
        {
            WalkSpeed = DefaultSpeed;
        }
    }
    

    【讨论】:

    • 好的,这有点帮助,但我仍然不知道如何为其创建 if 语句。
    • 它只是给我一个私有 parentScript = pS 的错误;
    • 我建议查看一些有关如何引用其他脚本变量的视频。我不希望这变得太长并且对人们造成烦恼。有很多视频,一旦你明白了,其他逻辑应该可以解决。很抱歉给我带来的不便,我现在很难检查错误
    • @EthanK-B 我修复了这个问题中的一些语法错误。您从未提及脚本类的名称,因此我无法输入确切的术语。希望它们有意义。
    • 再次感谢 Ruzihm 的出色工作!希望这现在可以解决您的问题,Ethan。
    【解决方案2】:

    创建一个布尔值isMoving,当他们移动时将其设置为真,当他们停止时设置为假。然后在你的void Shoot 中为移动的 bool 做一个 if 语句,并且只在它为 false 时触发。

    【讨论】:

    • 唯一的问题是控制移动的角色控制器脚本在父对象上,而射击脚本附加在子对象上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多