【问题标题】:C# script to return camera to a gameobject将相机返回到游戏对象的 C# 脚本
【发布时间】:2022-01-22 12:38:43
【问题描述】:

在 Unity 中,我有一个相机作为 2D 游戏对象的子对象(跟随它)。有一个 IF 语句可以让我通过按住一个键向前移动相机。放手后,我需要一个代码将相机返回给游戏对象。谢谢你的帮助。

public class camera : MonoBehaviour
{
    public float panspeed = 30f;
    public float panBorderThickness = 30f;
    public GameObject ship1;
    private Vector3 offset;
    

    void Update()
    {
        if (Input.GetKey("f"))
        {
            Vector3 pos = transform.position;
            if (Input.mousePosition.y >= Screen.height - panBorderThickness)
            {
                pos.y += panspeed * Time.deltaTime;
            }
            if (Input.mousePosition.y <= panBorderThickness)
            {
                pos.y -= panspeed * Time.deltaTime;
            }
            if (Input.mousePosition.x >= Screen.width - panBorderThickness)
            {
                pos.x += panspeed * Time.deltaTime;
            }
            if (Input.mousePosition.x <= panBorderThickness)
            {
                pos.x -= panspeed * Time.deltaTime;
            }
            transform.position = pos;
        }
        //something to return the camera back when i let go of F key
    }
}

【问题讨论】:

  • 这行得通吗? hastebin.com/takefujisu.hs
  • 如果是的,我将添加作为答案,我刚刚编写了伪代码 rn 没有编辑器
  • 好吧,当你放手时,你需要使用相同的过程将其移回。

标签: c# unity3d 2d


【解决方案1】:

如果我理解正确,您希望将相机平稳地移回原来的位置,所以我可能会这样做

private void Update ()
{
    if (Input.GetKey(KeyCode.F))
    {
        var pos = transform.position;
        if (Input.mousePosition.y >= Screen.height - panBorderThickness)
        {
            pos.y += panspeed * Time.deltaTime;
        }
        if (Input.mousePosition.y <= panBorderThickness)
        {
            pos.y -= panspeed * Time.deltaTime;
        }
        if (Input.mousePosition.x >= Screen.width - panBorderThickness)
        {
            pos.x += panspeed * Time.deltaTime;
        }
        if (Input.mousePosition.x <= panBorderThickness)
        {
            pos.x -= panspeed * Time.deltaTime;
        }
        transform.position = pos;
    }
    else
    {
        transform.position = Vector3.MoveTowards(transform.position, ship1.transform.position - ship1.transform.forward * 10, panspeed * Time.deltaTime);
    }
}

【讨论】:

  • 我遇到了一些麻烦。相机停止跟随游戏对象,当我完成移动时,它会返回到原始位置(此时游戏对象已经改变了它的位置)。我将“else”语句更改为“如果按下键 G”,当我按下 G 但仍回到原始位置时,它很好地平移回来。无论如何,我们可以将原始位置与当前、活动和移动的游戏对象联系起来吗?
  • @J3KB0T 哦,当然我不知道有一个移动的物体;)查看编辑...相机是 ship1 对象的子对象吗?
  • 是的,我希望它跟随物体,但也有能力向前侦察。
  • 如果它是一个子对象,您可能更希望对 transform.localPosition 进行操作,因此您所更改的只是相对于父对象的本地偏移量。
  • 我也有同样的想法,添加ship1.transform.position,但代码无法识别这个或“else”部分。它只是没有做任何事情,我不明白为什么。
【解决方案2】:
if(Input.GetKeyUp("f")){
    transform.position = ship1.transform.position;
}

旁注,您不能只为向量的一个分量赋值。您需要使用新组件重新分配整个向量或添加/减去原始向量。你的脚本应该是这样的

if (Input.GetKey("f"))
{
    Vector3 pos = transform.position;
    if (Input.mousePosition.y >= Screen.height - panBorderThickness)
    {
        pos += new Vector3(0, panspeed * Time.deltaTime, 0);
    }
    if (Input.mousePosition.y <= panBorderThickness)
    {
        pos -= new Vector3(0, panspeed * Time.deltaTime, 0);
    }
    if (Input.mousePosition.x >= Screen.width - panBorderThickness)
    {
        pos += new Vector3(panspeed * Time.deltaTime, 0, 0);
    }
    if (Input.mousePosition.x <= panBorderThickness)
    {
        pos -= new Vector3(panspeed * Time.deltaTime, 0, 0);
    }
    transform.position = pos;
}

if(Input.GetKeyUp("f"))
{
    transform.position = GameObjectYouWant.transform.position;
}

【讨论】:

  • “旁注,你不能只为向量的一个分量赋值。” - 是的你可以。 Vector3 是一个可变结构。例如,Vector3.x 的文档显示了此功能。
  • 据我所知,相机应该平稳地向后移动..不要立即拍摄
  • 它现在正在工作,但相机进入对象内部并且屏幕变为空白。你如何操纵它的 x y z 值?
  • 好的,您所要做的就是将 + new Vector3(0, 0, -10) 添加到 ship1.transform.position 以便相机后退...
  • @J3KB0T 你的意思是接受这个答案吗?我以为你想让相机在 F 键松开时平稳地向后移动。
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多