如何在统一 2d 中将相机连接到生成的玩家?

Posted

技术标签:

【中文标题】如何在统一 2d 中将相机连接到生成的玩家?【英文标题】:How do you attach a camera to a spawned player in unity 2d? 【发布时间】:2021-11-22 23:09:59 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案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 仍然是一个预制件,这个答案不能解决这个问题。

以上是关于如何在统一 2d 中将相机连接到生成的玩家?的主要内容,如果未能解决你的问题,请参考以下文章

如何统一停止相机跟随Y

如何统一使相机的边缘变灰

如何在情节提要中将属性 tableView 连接到 UITableView

如何修复 Android 模拟器中的“无法连接到相机服务”异常

如何在火花数据框中将列连接到一个

如何在动态查询中将行值连接到列名