当我以 2D 方式射击目标时,我试图打开门,但正如标题所说,它不起作用。在特殊的管道预制件中,我有一个孩子,它是管道,它有动画可以拉下充当门的管道。只有第一个对象起作用,但他的克隆立即打开门(动画立即激活,而不是在触发时激活)。抱歉英语不好。
有动画的目标脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TargetScript : MonoBehaviour
{
public Animator anim;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
anim = GameObject.FindGameObjectWithTag("BottomPipe").GetComponent<Animator>();
anim.enabled = false;
}
private void OnTriggerEnter2D(Collider2D collision)
{
anim.enabled = true;
Destroy(gameObject);
}
}
生成器脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PipeSpawnScript : MonoBehaviour
{
public GameObject pipe;
public GameObject specialPipe;
public float spawnRate = 2;
private float timer = 0;
public float heightOffset = 10;
// Start is called before the first frame update
void Start()
{
spawnPipe();
}
// Update is called once per frame
void Update()
{
if(timer < spawnRate)
{
timer += Time.deltaTime;
}else
{
spawnPipe();
timer = 0;
}
}
void spawnPipe()
{
float lowestPoint = transform.position.y - heightOffset;
float highestPoint = transform.position.y + heightOffset;
float randomNumber = Random.Range(0, 10);
if(randomNumber < 2)
Instantiate(pipe, new Vector3(transform.position.x, Random.Range(lowestPoint, highestPoint), 0), transform.rotation);
else
{
GameObject test = Instantiate(specialPipe, new Vector3(transform.position.x + 10, Random.Range(lowestPoint, highestPoint), 0), transform.rotation);
Animator anim = test.GetComponentInChildren<Animator>();
anim.Rebind();
}
}
}
我用谷歌搜索发现 Animator.rebind() 应该解决这个问题,但它对我不起作用。希望能提前找到答案和联系。
当您运行脚本并搜索“BottomPipe”标记对象时,Unity 会沿着层次结构树向下检查每个对象是否有该标记。如果找到原始对象并禁用动画。“TargetScript”的下一个实例执行相同的操作。它总是到达原始对象,说“任务完成”并平静下来,因此永远不会在应该停用您的动画时。
在您的情况下,您应该使用GetComponentInChildren,因为带有动画组件的管道是运行“TargetScript”的对象的子级。
如果由于某种原因,您有多个带有动画器组件的子对象(这有再次发生第一个问题的风险),您可以首先使用Transform.GetChild挑选出所需的子对象,然后使用经典的 Component.GetComponent获取组件方法。