如何使实例化的对象在实例化后继续跟随我的播放器



当我的玩家被击中时,我画了一个红色的小动画。我有一个我级别的射手,但我的问题是红色伤害效果会在我的玩家所在的位置瞬间产生,但当我的玩家移动时,物体会停留在玩家的旧位置。比如说我的球员是x:10。效果将在x:10产生,但当我移动到x:17时,效果将保持在x:10。

这是我的代码

public int damagedealt;
public Player playerscript;
public GameObject RedDamage;
public Vector2 playerpos;
public GameObject player;

// Start is called before the first frame update
void Start()
{
playerscript = FindObjectOfType<Player>();

}
// Update is called once per frame
void Update()
{
playerpos = player.transform.position;
player = GameObject.FindGameObjectWithTag("Player");
transform.Translate(Vector2.right * speed * Time.deltaTime);


}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
playerscript.health -= damagedealt;
Instantiate(RedDamage, playerpos, transform.rotation);
Destroy(gameObject);
}

}

如果它有用的话,这里是伤害效果脚本

{
public float duration;
// Start is called before the first frame update
void Start()
{
duration = .7f;
}
// Update is called once per frame
void Update()
{
duration -= Time.deltaTime;
if (duration <= .13f )
{
Destroy(gameObject);
}

}
}

您可以将follow脚本添加到要跟随玩家的对象中,也可以将对象子化到玩家。当一个对象被子对象化为另一个对象时,其变换将相对于其父对象。在您的情况下,实例化的对象会相对于玩家移动。

由于这看起来像是一个重复多次的临时效果,因此为在那里产生效果而对一个空对象进行子化可能是有意义的。创建一个空的gameObject,该对象是玩家对象的子对象(意味着放置在场景层次结构中(。确保将这个新的空对象的位置设置在您想要生成对象的位置。

一旦您对对象的放置位置感到满意,就可以稍微更改Instantiate以适应新方法。Instantiate对该方法有一些重载。我将使用的如下

public static Object Instantiate(Object original, Transform parent);

您将不指定旋转、位置等,而是指定对象放置和子对象所在的父对象

public int damagedealt;
public Player playerscript;
public GameObject RedDamage;
public Vector2 playerpos;
public GameObject player;
// serializing a field will expose it in the editor even if marked private
// while not allowing other scripts to access it
[SerializeField] private Transform DisplayDamageFeedback = null;
// Start is called before the first frame update
void Start()
{
playerscript = FindObjectOfType<Player>();

}
// Update is called once per frame
void Update()
{
playerpos = player.transform.position;
player = GameObject.FindGameObjectWithTag("Player");
transform.Translate(Vector2.right * speed * Time.deltaTime);


}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
playerscript.health -= damagedealt;
Instantiate(RedDamage, DisplayDamageFeedback);
Destroy(gameObject);
} 
}

确保将检查器中对DamageFeedback的引用分配给您之前创建的空gameObject。如果你在任何步骤上需要帮助,请告诉我。

试试这样的方法。

在效果"更新"脚本中:

GameObject  player = GameObject.FindGameObjectWithTag("Player");;
public void MoveGameObject()
{
transform.position = new Vector3(player.transfom.position.x,player.transform.position.y,player.transform.position.z);
}

这意味着每次更新都会找到玩家对象,并且效果的位置会设置为与玩家匹配。

有关Unity的立场示例,请参阅以下链接:https://docs.unity3d.com/ScriptReference/Transform-position.html

最新更新