如何解决来自导致问题的各种脚本的参考
出于某种原因,当我在游戏中处于正常视图时,我能够链接我需要调用的脚本以制作动画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 举报,一经查实,本站将立刻删除。