首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在Unity3d中通过UNET同步的问题

在Unity3d中通过UNET同步的问题
EN

Stack Overflow用户
提问于 2016-03-07 04:15:43
回答 1查看 1.5K关注 0票数 0

我在尝试通过网络同步球员的位置和轮换。我已经把事情部分地解决了。

我有两个球员,一个主机和远程。当查看主机的屏幕时,我看到了本地和网络播放器的正确位置。当在遥控器上时,我看到本地播放器的正确位置,但看不到联网播放器的正确位置。

这是我的同步脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(NetworkIdentity))]
public class SyncRigidbody : NetworkBehaviour {

    public float positionLerpSpeed = 10f;
    public float positionThreshold = 0.0025f;
    public float rotationLerpSpeed = 10f;
    public float rotationThreshold = 2f;

    private Rigidbody _rigidbody;
    private Vector3 _requestedPos;
    private Vector3 _lastPos;
    private Quaternion _requstedRot;
    private Quaternion _lastRot;

    void Start () {
        _rigidbody = gameObject.GetComponent<Rigidbody> ();
        if (!isLocalPlayer) {
            _rigidbody.isKinematic = true;
        }
    }

    void Update () {
        TransmitPosition ();
        TransmitRotation ();
        LerpPosition ();
        LerpQuaternion ();
    }

    void LerpPosition () {
        if (!isLocalPlayer) {
            _rigidbody.MovePosition (_requestedPos);
        }
    }

    void LerpQuaternion () {
        if (!isLocalPlayer && _requstedRot.w != 0) {
            _rigidbody.MoveRotation (_requstedRot);
        }
    }

    [Command]
    void CmdUpdateTransformPosition (Vector3 pos) {
        Debug.Log ("CmdUpdateTransformPosition: For " + gameObject.name + " to " + pos);
        _requestedPos = pos;
    }

    [Command]
    void CmdUpdateTransformRotation (Quaternion rot) {
        Debug.Log ("CmdUpdateTransformRotation: For " + gameObject.name + " to " + rot);
        _requstedRot = rot;
    }

    [Client]
    void TransmitPosition () {
        if (isLocalPlayer && Vector3.Distance (_rigidbody.position, _lastPos) > positionThreshold) {
            Debug.Log ("TransmitPosition: For " + gameObject.name + " to " + _rigidbody.position);
            CmdUpdateTransformPosition (_rigidbody.position);
            _lastPos = _rigidbody.position;
        }
    }

    [Client]
    void TransmitRotation () {
        if (isLocalPlayer && Quaternion.Angle (_rigidbody.rotation, _lastRot) > rotationThreshold) {
            Debug.Log ("TransmitRotation: For " + gameObject.name + " to " + _rigidbody.rotation);
            CmdUpdateTransformRotation (_rigidbody.rotation);
            _lastRot = _rigidbody.rotation;
        }
    }
}

我的想法是,我应该能够使用Rigidbody在任何对象上抛出这个脚本,它应该通过网络自动同步,并以本地播放器为源。

为什么在远程连接上我看不到主机上的同步对象我看到它们都是正确的?

EN

回答 1

Stack Overflow用户

发布于 2016-03-20 15:03:32

我不知道这是否会帮助你,但这里有两个脚本的位置和旋转同步,我正在使用,为我工作。也许不是最优化的,但它们是有效的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class Player_SyncPosition : NetworkBehaviour {

private Transform myTransform;
[SerializeField] float lerpRate = 15;
[SyncVar] private Vector3 syncPos;

private Vector3 lastPos;
private float threshold = 0.5f;

void Start () {
    myTransform = GetComponent<Transform> ();
}


void FixedUpdate () {
    TransmitPosition ();
    LerpPosition ();
}

void LerpPosition () {
    if (!isLocalPlayer) {
        myTransform.position = Vector3.Lerp (myTransform.position, syncPos, Time.deltaTime * lerpRate);
    }
}

[Command]
void Cmd_ProvidePositionToServer (Vector3 pos) {
    syncPos = pos;
}

[ClientCallback]
void TransmitPosition () {
    if (isLocalPlayer && Vector3.Distance(myTransform.position, lastPos) > threshold) {
        Cmd_ProvidePositionToServer (myTransform.position);
        lastPos = myTransform.position;
    }
}
}

旋转:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class Player_SyncRotation : NetworkBehaviour {

private Transform myTransform;

// Object rotation vars
[SyncVar] private Quaternion syncObjectRotation;
public float rotationLerpRate = 15;

private Quaternion lastRot;
private float threshold = 5f;


private void Start() {
    myTransform = GetComponent<Transform> ();
}

private void FixedUpdate () {
    LerpRotation ();
    TransmitRotation (); 
}

private void LerpRotation() {

    if (!isLocalPlayer) {
        myTransform.rotation = Quaternion.Lerp (myTransform.rotation, syncObjectRotation, Time.deltaTime * rotationLerpRate);
    }

}

[Command]
private void Cmd_ProvideRotationToServer (Quaternion objectRotation) {
    syncObjectRotation = objectRotation;
}

[ClientCallback]
private void TransmitRotation() { // Send rotation to server
    if (isLocalPlayer && Quaternion.Angle(myTransform.rotation, lastRot) > threshold) {
        Cmd_ProvideRotationToServer (myTransform.rotation);
        lastRot = myTransform.rotation;
    }
}

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35836074

复制
相关文章
flashfxp编辑文件显示活动编辑的取消办法
我一直在使用的是国产的8UFTP,但是最近win10系统貌似有点不和谐,编辑文件上传的时候会有一秒“未响应”的卡顿情况,所以有些别扭,又不想做回win7,所以就想起了比较强大的flashfxp。
李洋博客
2021/06/16
1.5K0
取消开机时显示DHCP
集成网卡解决方法: 开机按Del键进入Bios->Integrated Peripherals ->Onboard LAN Boot Rom 改为Disabled。
杨强生
2019/03/05
2.1K0
取消开机时显示DHCP
Linux下gdb使用gdb命令时显示找不到文件
用户10551528
2023/10/18
8070
Maven 错误找不到符号
当碰到maven错误:找不到符号问题时,通常第一反应应该是执行eclipse的Project -> Clean … -> Clean all projects,然后再执行maven clean,将项目清理一下,然后再试试,如果还是不能解决接着往下看。
我是李超人
2020/08/20
7.4K0
vs2010点调试,显示系统找不到指定的文件
首先,查看“项目”-“属性”-“链接器”-“常规”-“输出文件”,路劲是否是“bin/xxx.exe”, 如果是请继续看我的解答,否则请忽略下面的内容。 原因是用VS2010加载调试以前的VC6.0下
互联网金融打杂
2018/04/03
2.3K0
vs2010点调试,显示系统找不到指定的文件
git取消文件跟踪
在使用git的时候,有些文件是不需要上传的,所以就可以修改   .gitignore 
lin_zone
2018/08/15
1.3K0
git取消文件跟踪
《SpringCloud错误篇:application.yml文件显示灰色》
2.File Types—>Text—>application.yml删除
2020/11/13
1.4K0
《SpringCloud错误篇:application.yml文件显示灰色》
git取消文件跟踪
在使用git的时候,有些文件是不需要上传的,所以就可以修改 .gitignore
全栈程序员站长
2022/07/07
1.5K0
git取消文件跟踪
bootstrap-fileinput上传完文件后再打开上传文件界面显示取消按钮
Bootstrap File Input是一款基于bootstrap框架的html5上传文件插件,具体展示效果如下:
johnhuster的分享
2022/03/28
1.8K0
bootstrap-fileinput上传完文件后再打开上传文件界面显示取消按钮
git 取消文件跟踪
git rm --cached readme1.txt    删除readme1.txt的跟踪,并保留在本地。
西湖醋鱼
2020/12/30
1.5K0
pycharmimport时找不到指定文件_pycharm系统找不到指定文件
Error running ‘hello’: Cannot run program “B:\pystudy\venv\Scripts\python.exe” (in directory “\python-study”): CreateProcess error=2, 系统找不到指定的文件。
全栈程序员站长
2022/09/27
5.7K0
pycharmimport时找不到指定文件_pycharm系统找不到指定文件
git 取消托管文件
如果想要取消托管某文件夹,通过如下命令能解决: git rm -r --cached .idea #--cached不会把本地的.idea删除 git commit -m '描述信息' git push -u origin master
week
2019/08/14
2.6K0
git取消跟踪文件
取消跟踪文件: $git rm --cached FILENAME 取消跟踪目录: $git rm --cached FILENAME -r   最佳解决方案: 先清空,再加回来。 git rm -r --cached . #删除追踪状态 git add . git commit -m "fixed untracked files"
Ryan-Miao
2018/03/13
7540
JavaScript实现显示时间,暂停时间,和取消显示时间
//显示时间函数 var id;//设置该id主要是为了之后的暂停和取消显示时间用到clearInterval(这里传id); function showTime(){ var divOne=document.getElementById("one"); var d=new Date(); var timStr=d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()+" "+ d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+":"+d.getMilliseconds(); divOne.innerHTML=timStr; id=setInterval(function(){ d=new Date(); timStr=d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()+" "+ d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+":"+d.getMilliseconds(); divOne.innerHTML=timStr; }, 1) }
小小鱼儿小小林
2020/06/23
2.3K0
点击显示错误
双折线点击一个,另一显示a b 错误.PNG 正确.PNG 隐藏一条线 tooltip: { // 气泡 trigger: "axis"
用户4344670
2019/08/28
1.2K0
点击显示错误
小程序开发找不到appjson_appjson文件内容错误未找到
– 问题原因: 导入微信开发者工具后project.config.json文件被微信开发者工具修改,缺少代码:“miniprogramRoot”: “./dist”从而导致微信开发者工具无法找到app.json文件进而报错:app.json: app.json 未找到,所以需要找到app.json 文件所在的文件夹,然后在project.config.json文件里写上aap.json的路径重新运行即可。
全栈程序员站长
2022/11/04
3.1K0
小程序开发找不到appjson_appjson文件内容错误未找到
Typecho评论回复取消回复按钮合并显示
第一步屏蔽默认评论js 将header.php中的header(); ?>改为header('commentReply='); ?> 第二步放置重构的js代码 将下面的一堆js代码放到comment
泽泽社长
2023/04/17
1.2K0
Typecho评论回复取消回复按钮合并显示
「R」显示英文错误
中文使用 R 经常看到各种乱码文字,让人看不懂意思,特别是在 Windows 系统上。
王诗翔呀
2020/07/02
1.8K0
CMD批处理——forfiles命令使用,自动删除过期备份文件
公司服务器用来备份数据的硬盘过段时间就会被备份文件占满,弄得我老是要登录到服务器去手工删除那些老的文件,有时忘记了就会导致硬盘空间不足而无法备份。 因为只要保留最近几天的备份,如果可以做一个批处理让系统自动删除老备份文件就好了,但是Windows的命令行和Linux的Shell比起来功能差了很多,到底行不行我自己也不清楚。 于是上网查了一下各位大虾发的帖子,再经过自己的摸索和尝试,发现只要花点功夫还是能实现这个功能的。 Windows Server 2003内置的命令行文件,适合于XP以上系统 示例:
landv
2018/05/24
4.4K0
点击加载更多

相似问题

找不到AngularJS映像取消显示错误

11

删除文件夹时出现forfiles错误

313

Forfiles -排序文件

20

Output forfiles错误到变量

04

找不到P4取消搁置文件错误

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文