Networking 使用全向相机确定网络上的方向

Networking 使用全向相机确定网络上的方向,networking,unity3d,2d,flip,Networking,Unity3d,2d,Flip,我有一个相当困难的问题。我正在做一个自上而下的2D游戏。我决定制作一个全方位的角色控制,就像《疯狂的上帝》一样(第16秒的视频显示了这意味着什么)。我的一切都很好,并设法解决了几乎所有这类相机的怪癖,但有一件事仍然存在 (如果你不知道我在看什么效果,你可以在16秒的时候看到并举例说明:) 当主客户端的相机旋转超过180度时,左变成右,右变成左,我向服务器发送的消息是,当给定角色应该翻转时,将翻转角色。我做了一个if语句,当你的世界完全翻转时,它会发送一个相反的翻转请求 然而,上下也成为一个因素,

我有一个相当困难的问题。我正在做一个自上而下的2D游戏。我决定制作一个全方位的角色控制,就像《疯狂的上帝》一样(第16秒的视频显示了这意味着什么)。我的一切都很好,并设法解决了几乎所有这类相机的怪癖,但有一件事仍然存在

(如果你不知道我在看什么效果,你可以在16秒的时候看到并举例说明:)

当主客户端的相机旋转超过180度时,左变成右,右变成左,我向服务器发送的消息是,当给定角色应该翻转时,将翻转角色。我做了一个if语句,当你的世界完全翻转时,它会发送一个相反的翻转请求

然而,上下也成为一个因素,因为他们不发送翻转角色的请求

我想说的是,当我试图从所有客户端获取正确的消息时,我已经过度使用了我所相信的这个脚本

我想知道是否有人有一个合乎逻辑的解决方案来确保网络上的所有角色在任何时候都面对正确的方向

我使用socket.io和Node.js与服务器对话

任何输入都将被显示

TL;博士

当所有的客户都需要知道每个人面对的是什么样的情况时,你们会如何着手制作“疯神”相机旋转风格的领域。(见视频0:16)


谢谢。

我已经通过重写我的逻辑在某种程度上解决了这个问题,并成功地使所有的魔法都发生在客户端上,并使服务器完全脱离它。我不知道我所做的是不是超级高效,因为我对编码相当陌生

逻辑是,我已经创建了一个代表玩家视野的圆R2D。因此,稍微超出摄影机视图的内容也包括在内。与标记为“otherPlayer”的对象的任何碰撞都会将其添加到列表中

然后,如果列表不是空的,我将遍历该列表,并确定该对象是否正在向我移动。(感谢您向HigherScriptingAuthority提供此的部分代码:)

一旦我知道了这一点,我所要做的就是抓取该对象的变换并相应地翻转它。Boom现在可以正确旋转对象或播放器,无论主客户端处于何种旋转状态

希望这是有意义的,并且对某人有帮助:

private float lastDist = 0;
public float dirNum;

void CheckArea()
{
    if (listOfPlayers.Count != 0)
    {
        foreach(var otherPlayer in listOfPlayers)
        {
            float distance = (transform.position - otherPlayer.transform.position).magnitude;
            if (distance < lastDist)
            {
                Vector3 heading = otherPlayer.transform.position - transform.position;
                dirNum = AngleDir(transform.forward, heading, transform.up);
                var objectDirection = AngleDir(transform.forward, heading, transform.up);

                if (objectDirection > 0)
                {
                    var nav = otherPlayer.GetComponent<Navigator>();
                    nav.Left();
                }
                if (objectDirection < 0)
                {
                    var nav = otherPlayer.GetComponent<Navigator>();
                    nav.Right();
                }

            }
            if (distance > lastDist)
            {
                Vector3 heading = otherPlayer.transform.position - transform.position;
                dirNum = AngleDir(transform.forward, heading, transform.up);
                var objectDirection = AngleDir(transform.forward, heading, transform.up);

                if (objectDirection > 0)
                {
                    var nav = otherPlayer.GetComponent<Navigator>();
                    nav.Right();
                }
                if (objectDirection < 0)
                {
                    var nav = otherPlayer.GetComponent<Navigator>();
                    nav.Left();
                }

            }
            lastDist = distance;
        }
    }
}
private float lastDist=0;
公共浮点数;
无效检查区域()
{
如果(listOfPlayers.Count!=0)
{
foreach(ListOtherPlayer中的变量)
{
浮动距离=(transform.position-otherPlayer.transform.position).magnity;
如果(距离<最后距离)
{
Vector3 heading=otherPlayer.transform.position-transform.position;
dirNum=AngleDir(transform.forward、heading、transform.up);
var objectDirection=AngleDir(transform.forward、heading、transform.up);
如果(objectDirection>0)
{
var nav=otherPlayer.GetComponent();
导航左();
}
if(objectDirection<0)
{
var nav=otherPlayer.GetComponent();
导航右();
}
}
如果(距离>最后距离)
{
Vector3 heading=otherPlayer.transform.position-transform.position;
dirNum=AngleDir(transform.forward、heading、transform.up);
var objectDirection=AngleDir(transform.forward、heading、transform.up);
如果(objectDirection>0)
{
var nav=otherPlayer.GetComponent();
导航右();
}
if(objectDirection<0)
{
var nav=otherPlayer.GetComponent();
导航左();
}
}
lastDist=距离;
}
}
}