微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

来自导致问题的各种脚本的参考

如何解决来自导致问题的各种脚本的参考

出于某种原因,当我在游戏中处于正常视图时,我能够链接我需要调用的脚本以制作动画like so

但是,每当我开始游戏时,它都会自动将它们从插槽中删除,并且 doesn't work

我完全不知道为什么会发生这种情况,而团结一直给我errors that say that I'm not setting an instance to my script我真的不知道为什么会发生这种情况。

我正在使用 3 个脚本,这给我带来了问题 一个是敌人视野的主要脚本(我在这个脚本中引用了其他脚本) 第二个是敌人的动画脚本,让他从空闲到攻击,第三个是枪模型的动画,因为我必须让它跟随敌人的手

下面附上脚本

一个脚本(enemyAI):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyAi : MonoBehavIoUr
{

public bool detected;
GameObject target;
public Transform enemy;

public GameObject Bullet;
public Transform shootPoint;

public float shootSpeed = 10f;
public float timetoShoot = 1f;

public EnemyAni Animation;
public GunAni GunAnimation;

void Start()
{
    Animation = GetComponent<EnemyAni>();
    GunAnimation = GetComponent<GunAni>();
}

public void Update()
{
    //makes the enemy rotate on one axis
    Vector3 lookDir = target.transform.position - transform.position;

    lookDir.y = 0f;

    //makes enemy look at the players position
    if (detected)
    {
        enemy.LookAt(target.transform.position,Vector3.up);
        enemy.rotation = Quaternion.LookRotation(lookDir,Vector3.up);
    }

    if (detected == true)
    {
        Animation.LookPlayer = true;
        GunAnimation.ShootPlayer = true;
    }

    if (detected == false)
    {
        Animation.LookPlayer = false;
        GunAnimation.ShootPlayer = false;
    }
}

//detects the player
void OnTriggerEnter(Collider other)
{
    if (other.tag == "Player")
    {
        detected = true;
        target = other.gameObject;
    }
}

void OnTriggerExit(Collider other)
{
    if (other.tag == "Player")
    {
        detected = false;
    }
}
}

第二个脚本(EnemyAnimation):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyAni : MonoBehavIoUr
{


public Animator animator;

public bool LookPlayer;

public void Start()
{
    animator = GetComponent<Animator>();
}

public void Update()
{
    if (LookPlayer == true)
    {
       animator.SetBool("IsShootingStill",true);
    }
    else
    {
        animator.SetBool("IsShootingStill",false);
    }
}
}

第三个脚本(枪动画):

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class GunAni : MonoBehavIoUr
    {
    
    
        public Animator animator;
    
        public bool ShootPlayer;
    
        public void Start()
        {
            animator = GetComponent<Animator>();
        }
    
        public void Update()
        {
            if (ShootPlayer == true)
            {
                animator.SetBool("IsShooting",true);
            }
            else
            {
                animator.SetBool("IsShooting",false);
            }
        }
    }

解决方法

您的代码:

void Start()
{
    Animation = GetComponent<EnemyAni>();
    GunAnimation = GetComponent<GunAni>();
}

搜索包含 EnemyAni 和 GunAni 的 EnemyAI 脚本的游戏对象。如果 GameObject 没有这些,它将返回 null。

听起来您想删除该代码。

请注意,如果该脚本存在于该 GameObject 的子项上,您将需要使用 GetComponentInChildren

,

有一些事情需要回顾,好的做法:

  • GameObject target 对于 C# 是私有的,但最好将 private 放在前面。
  • Bullet Animation GunAnimation 这样的变量名应该总是以小写开头,因为它们可能会与类名混淆(在互联网上搜索 CamelCase 和 PascalCase)。
  • 名称应该清楚。 EnemyAni Animation 不够清楚,因为 Animation 可能是任何动画(玩家、敌人、立方体、汽车等)。
    最好把 enemyAnimation 说清楚,就像你对 GunAnimation 所做的一样(只是开头只是小写)
  • 正如 slaw 所说,动画必须在附加的 GO 中。

关于最后一项
假设您有一个名为 GameObject1 的空 GO(游戏对象),并且您将 EnemyAi 脚本附加到它。
在运行时(游戏模式开始时),它会尝试找到Animation = GetComponent<EnemyAni>();,但找不到

为什么?
因为 GetComponent<> 在其 GO(在本例中为 <>)中搜索 EnemyAni(在本例中为 GameObject1)中的 Component(Class),但是唯一的附加到 GameObject1 的脚本是 EnemyAI

因此,您有 3 个选择:

  • EnemyAni 附加到 GameObject1
  • 创建另一个 GO(例如 GameObjectEnemyAni),附加脚本 EnemyAni 并将 GameObjectEnemyAni 拖放到 GameObject1 并删除 {{ 1}}

请记住:如果您保留该行代码,而不是从 Animation = GetComponent<EnemyAni>(); 获取脚本 Start,它会在EnemyAni,很明显,它不会找到它

  • 创建事件。这是避免代码紧耦合的一个非常好的做法,但这是更高级的东西。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。