【问题标题】:How do you attach a camera to a spawned player in unity 2d?如何在统一 2d 中将相机连接到生成的玩家?
【发布时间】:2023-03-28 15:35:02
【问题描述】:

所以我正在开发一个统一 2d 中的简单平台游戏。我创建了一个关卡生成器,可以在关卡开始时生成随机地形、敌人和玩家角色。我想让相机跟随玩家角色。我尝试使用 SetParent() 方法将玩家角色设置为主摄像机的子角色。我收到此错误消息:“设置驻留在预制资产中的转换的父级已禁用以防止数据损坏。”有没有办法解决这个问题?还是有其他方法可以让我的主摄像机跟随生成的玩家角色?

这是我的关卡生成器的玩家角色生成药水:

                if (x == 1)
                    {
                        Instantiate(player, new Vector3Int(x, y + 2, 0), Quaternion.identity);
                        player.transform.SetParent(MainCamera);
                    }

任何帮助将不胜感激。谢谢!!

【问题讨论】:

    标签: c# unity3d camera procedural-generation


    【解决方案1】:

    预制件没有父级,这就是你遇到这个问题的原因。

    修改player 是修改一个预制件。但是,您的意思是修改由该预制件制作的实例。您需要获取Instantiate 的结果并对其进行修改。

    您可能还想保存它以供以后参考,因此为此添加一个字段是合适的。

    总共:

    private GameObject playerInstance; 
    
    // ...  
    
    playerInstance = Instantiate(player, new Vector3Int(x, y + 2, 0), Quaternion.identity); 
    playerInstance.transform.SetParent(MainCamera.transform);
    

    或者,如果您想让相机成为您的玩家的孩子,以便它自动跟随玩家。如果这样做,您可能还希望将SetParentworldPositionStays 参数设置为false,以便在设置父级时相机保持其本地位置。

    private GameObject playerInstance; 
    
    // ...  
    
    playerInstance = Instantiate(player, new Vector3Int(x, y + 2, 0), Quaternion.identity); 
    mainCamera.transform.SetParent(playerInstance.transform, false);
    

    【讨论】:

    • 谢谢!!!这工作得很好!!在使用第二种方法时,我只需将 .transform 添加到 playerinstance 中,并且在没有 worldPositionStays 参数的情况下效果更好(当我在那里设置错误时,相机只是纯色背景色)。再次感谢!!!
    【解决方案2】:

    尝试直接将父级指定为预制件的实例,然后将相机的本地变换归零:

    GameObject myPlayer = Instantiate(player, new Vector3Int(x, y + 2, 0), Quaternion.identity); //GameObject can be whatever object type player is
    myPlayer.transform.parent = MainCamera.transform;
    MainCamera.transform.localPosition = Vector3.zero;
    

    【讨论】:

    • player 仍然是一个预制件,这个答案不能解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多