抛射物不移动,也不从玩家开始(Unity 2D / C#)

Projectiles not moving, and not starting from the player (Unity 2D / C#)

信息
所以我正在尝试制作一款自上而下的无尽竞技场战斗游戏,你的盾牌也可以作为你的进攻手段。盾牌应该在玩家前方生成,并在玩家移动和旋转时保持在前方(同时按住 mouse1(确实如此))。一旦mouse1被释放,盾牌应该像弹丸一样向前发射。

问题
但是,当mouse1被释放时,盾牌向前移动一点然后冻结,但无论玩家在哪里,他们移动就像玩家在 0, 0.

(我知道这是有点混乱,所以这是一张照片:)
(三角形是玩家)

CODE
这是我的播放器控制器脚本:

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

public class PlayerController : MonoBehaviour
{
    public Rigidbody2D rb;

    public GameObject Shield;

    public float moveSpeed = 4.3f;
    public float sheildSpeed = 2f;
    
    Vector2 movement;

    bool isDead = false;

    void Update()
    {
        movement.x = Input.GetAxisRaw("Horizontal");
        movement.y = Input.GetAxisRaw("Vertical");

        Vector3 mouseScreen = Input.mousePosition;
        Vector3 mouse = Camera.main.ScreenToWorldPoint(mouseScreen);

        transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(mouse.y - transform.position.y, mouse.x - transform.position.x) * Mathf.Rad2Deg - 90); 

        if (Input.GetMouseButtonDown(0)) {
            Shield = Instantiate(Shield, transform.position + transform.forward + transform.up, transform.rotation);
            Shield.transform.parent = transform;
        }

        if (Input.GetMouseButtonUp(0)) {
            Shield.transform.parent = null;
        } 
    }

    void FixedUpdate() {
        if (!isDead) {
            rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
        }
    }
}

这是护盾脚本:

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

public class ShieldController : MonoBehaviour
{
    public float sheildSpeed = 2f;

    void FixedUpdate()
    {
        this.GetComponent<Rigidbody2D>().MovePosition(this.transform.up * sheildSpeed);       
    }
}

注意
我希望我已经提供了足够的信息让你能够帮助我,但是如果你需要/想要更多的细节,请留下 aaa 评论,我希望会回复您需要的任何内容:)

嘿,我在自己的项目中对此进行了测试并使其正常工作

改变这个

void FixedUpdate()
{
    this.GetComponent<Rigidbody2D>().MovePosition(this.transform.up * sheildSpeed);       
}

进入这个

public void LaunchForward(float speed)
{
    this.GetComponent<Rigidbody2D>().velocity = transform.up * speed;
}   

我也把重生编辑了一下

public GameObject Shield;
public GameObject ShieldInstance;

if (Input.GetMouseButtonDown(0))
    {
        if (ShieldInstance != null) { return; }
        ShieldInstance = Instantiate(Shield, transform.position + transform.forward + transform.up, transform.rotation);
        ShieldInstance.transform.parent = transform;
    }

if (Input.GetMouseButtonUp(0))
    {
        ShieldInstance.transform.parent = null;
        ShieldInstance.GetComponent<ShieldController>().LaunchForward(5f);
        Destroy(ShieldInstance, 3f);
    }

但主要问题是防护罩本身的物理特性,代码与 2 个函数发生冲突,这导致了我认为的奇怪行为

编辑:设置速度只需要一次,因此这里使用专用方法是合适的(来源 derHugo)。 虽然您可以在播放器 class 中使用此方法,但如果您希望在游戏中有更复杂的行为

,则将其放在自己的 class 中会更好