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

How do I make an instantiated object keep following my player after its instantiated?

当我的玩家被击中时,我画了一个红色的小动画。我的关卡中有一个箭射手,但我的问题是红色伤害效果实例化了我的玩家所在的位置,但是当我的玩家移动时,对象停留在玩家的旧位置。比如说我的播放器在 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);
        }
        
    }
}

尝试这样的事情。

在效果的 'Update' 脚本中:

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的位置示例见下面link: https://docs.unity3d.com/ScriptReference/Transform-position.html

您可以将跟随脚本添加到您想要跟随玩家的对象,也可以将对象添加到玩家。当一个对象成为另一个对象的子对象时,它的变换就变成相对于它的父对象。在您的情况下,您的实例化对象将相对于您的播放器移动。

由于这似乎是一个重复多次的临时效果,因此为在那里生成效果的唯一目的而创建一个空对象可能是有意义的。创建一个空的游戏对象,它被子化(意味着放置在场景层次结构中)到您的玩家对象。确保将这个新的空对象的位置设置在您想要生成对象的地方。

一旦您对放置对象的位置感到满意,就可以稍微更改 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 的引用分配给您之前创建的空游戏对象。如果您在任何步骤上需要帮助,请告诉我。