用PUN插件的话,就在OnJoinedRoom()回调函数里,表示加入房间,可以实例化角色,GameObject go=PhotonNetwork.Instantiate(prefabPlayer.name, new Vector3(241,0.2f,253), Quaternion.identity, 0);这里的prefabPlayer需要放在Resources文件夹里。

prefabPlayer上加上一个PhotonView组件,

为了同步在角色坐标,这里需要一个回调函数, void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info);在调用这个函数之前,需要做一点准备工作,因为这个函数我是写在PlayerPesonNetWork这个脚本里,所以需要把这脚本拖在PhotonView的Observed Components下,这样你就能在PlayerPesonNetWork脚本里的 void OnPhotonSerializeView(PhotonStream
stream, PhotonMessageInfo info);去写一些同步的信息。

这里我把PlayerPesonNetWork脚本粘出来:

using UnityEngine;
using System.Collections;
using Newtonsoft.Json; public class PlayerPesonNetWork : Photon.MonoBehaviour
{
GirlSniper girlSniper;
public static PlayerPesonNetWork PPNW;
void Awake()
{
girlSniper = GetComponent<GirlSniper>();
if (photonView.isMine)
{
girlSniper.isControl = true;
GameObject.Find("GameObjectMainCamera").GetComponent<MouseRotation>().target = gameObject.transform;
}
else
{
girlSniper.isControl = false;
}
gameObject.name = gameObject.name + photonView.viewID;
PPNW = this;
}
void Start()
{
} void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
{
if (stream.isWriting)
{
//动作状态根据需求写的
//将自己的动作状态 坐标 旋转角度传出
stream.SendNext( JsonConvert.SerializeObject(girlSniper.animatorState_D));
stream.SendNext(transform.position);
stream.SendNext(transform.rotation);
}
else
{
//获取动作状态 坐标 旋转角度
girlSniper.animatorState_D = JsonConvert.DeserializeObject <AnimatorState_D>((string)stream.ReceiveNext());
correctPlayerPos = (Vector3)stream.ReceiveNext();
correctPlayerRot = (Quaternion)stream.ReceiveNext();
}
}
private Vector3 correctPlayerPos = Vector3.zero; //We lerp towards this
private Quaternion correctPlayerRot = Quaternion.identity; //We lerp towards this // Update is called once per frame
void Update () { if (!photonView.isMine)
{
transform.position = Vector3.Lerp(transform.position, correctPlayerPos, Time.deltaTime * 5);
transform.rotation = Quaternion.Lerp(transform.rotation, correctPlayerRot, Time.deltaTime * 5);
}
} }

同时我再把自己写的控制角色脚本也粘出来,这脚本也是绑在prefabPlayer上的:

using UnityEngine;
using System.Collections; public class GirlSniper : MonoBehaviour {
public Animator animator;
private Camera cam;
private UISprite spriteX;
public bool isControl = true;
public AnimatorState_D animatorState_D;
private float playerSpeed = 2.0f;
private GameObject goCameraParent;
// public GameObject goShootAnimation;//开枪特效
// Use this for initialization
void Start () {
goCameraParent = GameObject.Find("GameObjectMainCamera").gameObject;
animator = GetComponent<Animator>();
cam = Camera.main;
spriteX = GameObject.Find("UI Root").transform.FindChild("Camera").FindChild("X").GetComponent<UISprite>();
animatorState_D = new AnimatorState_D(); } // Update is called once per frame
void Update ()
{
if (animator)
{
if (!isControl)
{
enumUpdate();
}
else
{
isControlUpdate();
}
}
}
//控制更新
void isControlUpdate()
{
float fVertical = Input.GetAxis("Vertical");
float fHorizontal = Input.GetAxis("Horizontal");
//当前的动画状态 参数0表示当前层级为0
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
if (stateInfo.IsName("Base Layer.moveForward"))
{
if (Input.GetKeyDown(KeyCode.Space))
{
animator.SetBool("jump", true);
animatorState_D.jump = true;
transform.Translate(Vector3.forward * 2);
}
else if (Input.GetKeyUp(KeyCode.Space))
{
animator.SetBool("jump", false);
animatorState_D.jump = false;
}
} if (stateInfo.IsName("Base Layer.idle"))
{
animator.SetBool("jump", Input.GetKeyDown(KeyCode.Space));
animator.SetBool("happy", Input.GetKeyDown(KeyCode.H));
animator.SetBool("sad", Input.GetKeyDown(KeyCode.U)); animatorState_D.jump=Input.GetKeyDown(KeyCode.Space);
animatorState_D.happy=Input.GetKeyDown(KeyCode.H);
animatorState_D.sad = Input.GetKeyDown(KeyCode.U);
}
if (stateInfo.IsName("Base Layer.idle_look"))
{
animator.SetBool("jump", Input.GetKeyDown(KeyCode.Space));
animator.SetBool("happy", Input.GetKeyDown(KeyCode.H));
animator.SetBool("sad", Input.GetKeyDown(KeyCode.U)); animatorState_D.jump = Input.GetKeyDown(KeyCode.Space);
animatorState_D.happy = Input.GetKeyDown(KeyCode.H);
animatorState_D.sad = Input.GetKeyDown(KeyCode.U);
}
if (Input.GetMouseButtonDown(0))
{
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, goCameraParent.transform.localEulerAngles.y, transform.localEulerAngles.z);
animator.SetBool("shoot", true);
Camera.main.GetComponent<Animator>().SetBool("shutDown",true);
Ray ray01 = cam.ViewportPointToRay(new Vector3(0.45f, 0.65f, 0.0f));
RaycastHit hit;
if (Physics.Raycast(ray01, out hit))
{
if (hit.transform.tag == "Player")
{
spriteX.color = Color.yellow;
PlayerPesonNetWork.PPNW.SendDieMessage(hit.transform.name, PhotonTargets.All);
}
else
{
spriteX.color = Color.white;
}
}
}
else if (Input.GetMouseButtonUp(0))
{
animator.SetBool("shoot", false);
spriteX.color = Color.white;
Camera.main.GetComponent<Animator>().SetBool("shutDown", false);
} if (Mathf.Abs(fHorizontal) > 0.1f || Mathf.Abs(fVertical) > 0.1f)
{
animator.SetBool("shiftForward", true);
animatorState_D.shiftForward = true;
}
if (Mathf.Abs(fHorizontal) <= 0.1f && Mathf.Abs(fVertical) <= 0.1f)
{
animator.SetBool("shiftForward", false);
animatorState_D.shiftForward = false;
} if (Input.GetAxis("Vertical") > 0.1f && animator.GetBool("shoot") == false)
{
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, goCameraParent.transform.localEulerAngles.y, transform.localEulerAngles.z);
transform.Translate(Vector3.forward * Time.deltaTime * playerSpeed);
}
if (Input.GetAxis("Vertical") < -0.1f && animator.GetBool("shoot") == false)
{
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, goCameraParent.transform.localEulerAngles.y + 180, transform.localEulerAngles.z);
transform.Translate(Vector3.forward * Time.deltaTime * playerSpeed);
}
if (Input.GetAxis("Horizontal") > 0.1f && animator.GetBool("shoot") == false)
{
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, goCameraParent.transform.localEulerAngles.y + 90, transform.localEulerAngles.z);
transform.Translate(Vector3.forward * Time.deltaTime * playerSpeed);
}
if (Input.GetAxis("Horizontal") < -0.1f && animator.GetBool("shoot") == false)
{
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, goCameraParent.transform.localEulerAngles.y + 270, transform.localEulerAngles.z);
transform.Translate(Vector3.forward * Time.deltaTime * playerSpeed);
} }
//枚举更新
void enumUpdate()
{
animator.SetBool("jump",animatorState_D.jump);
animator.SetBool("shiftForward", animatorState_D.shiftForward);
animator.SetBool("happy", animatorState_D.happy);
animator.SetBool("sad", animatorState_D.sad);
animator.SetBool("shoot", animatorState_D.shoot);
animator.SetBool("die",animatorState_D.die);
} } public class AnimatorState_D
{
public bool jump = false;
public bool shiftForward = false;
public bool happy = false;
public bool sad = false;
public bool shoot = false;
public bool die = false;
}

Unity PUN插件多人在线同步角色坐标旋转角度和动作的更多相关文章

  1. Unity 常用插件1

    作者:Meta42链接:https://www.zhihu.com/question/29097415/answer/229015898来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  2. 分享一个基于长连接+长轮询+原生的JS及AJAX实现的多人在线即时交流聊天室

    实现网页版的在线聊天室的方法有很多,在没有来到HTML5之前,常见的有:定时轮询.长连接+长轮询.基于第三方插件(如FLASH的Socket),而如果是HTML5,则比较简单,可以直接使用WebSoc ...

  3. 【坦克大战】Unity3D多人在线游戏(泰课的坦克大战--旋转的螺丝钉)

    [坦克大战]Unity3D多人在线游戏 http://www.taikr.com/my/course/937 1.NetworkManager的介绍: 说明:选择固定生成时会自动寻找有StartPos ...

  4. Unity3d多人在线教程

    [转载]Unity3d多人在线教程 (2013-02-25 16:02:49) 转载▼ 标签: 转载   原文地址:Unity3d多人在线教程作者:lsy0031 Unity 多个玩家开发教程 Uni ...

  5. 一个3D的多人在线游戏, 服务端 + 客户端 【转】

    最近学院组织了一个实训,要求是利用Socket通信和D3D的知识, 写一个多人在线的游戏, 服务端是在linux下, 客户是在Windows下: 写这个的目的是想让大家给我找错, 欢迎大家的意见.我的 ...

  6. 负载均衡--大型在线系统实现的关键(上篇)(再谈QQ游戏百万人在线的技术实现)

    http://blog.csdn.net/sodme/article/details/393165 —————————————————————————————————————————————— 本文作 ...

  7. 基于JQuery+JSP的无数据库无刷新多人在线聊天室

    JQuery是一款非常强大的javascript插件,本文就针对Ajax前台和JSP后台来实现一个无刷新的多人在线聊天室,该实现的数据全部存储在服务端内存里,没有用到数据库,本文会提供所有源程序,需要 ...

  8. 网页版Rstudio︱RStudio Server多人在线协作开发

    网页版Rstudio︱RStudio Server多人在线协作开发 想了解一下RStudio Server,太给力的应用,可以说成是代码分布式运行,可以节省时间,放大空间. RStudio是一个非常优 ...

  9. 开发unity DLL插件

    最近开发一款设备的SDK,想着要开发unity版本,怎么做呢?首先想到的就是在外部编写相关的驱动程序然后集成成几个dll作为unity的SDK使用了.So,我就开始了unity外部插件的研究之旅了. ...

随机推荐

  1. Tomcat的系统安全管理

    Tomcat是一个Web容器,我们开发的Web项目运行在Tomcat平台,这就好比将一个应用嵌入到一个平台上面运行,要使嵌入的程序能正常运行,首先平台要能安全正常运行.并且要最大程度做到平台不受嵌入的 ...

  2. android拍照获得图片及获得图片后剪切设置到ImageView

    ok,这次的项目需要用到设置头像功能,所以做了个总结,直接进入主题吧. 先说说怎么 使用android内置的相机拍照然后获取到这张照片吧 直接上代码: Intent intentFromCapture ...

  3. SQL 数据库语言分析总结(三)

    这次介绍通过mysql-WorkBench这个工具来管理操作数据库. 创建和删除数据库 1.点击创建数据库按钮 2.选中后右键,出现drop schema一项,这个用来删除. 设置默认数据库 选中右键 ...

  4. 【移动开发】SparseArray替代HashMap

    SparseArray是android里为<Interger,Object>这样的Hashmap而专门写的class,目的是提高效率,其核心是折半查找函数(binarySearch). p ...

  5. 02_MyBatis项目结构,所需jar包,ehcache.xml配置,log4j.properties,sqlMapConfig.xml配置,SqlMapGenerator.xml配置

     项目结构(所需jar包,配置文件) sqlMapConfig.xml的配置内容如下: <?xmlversion="1.0"encoding="UTF-8&qu ...

  6. 收藏了4年的Android 源码分享

    Android 超过2个G的源代码集合~~几乎涵盖了所有功能效果的实现,一应俱全~~应有尽有~~ 360云盘地址:Android 各类源码集合汇总 (提取码:f930) 另外,附上Github上及自己 ...

  7. RMI方式Ehcache集群的源码分析

    Ehcache不仅支持基本的内存缓存,还支持多种方式将本地内存中的缓存同步到其他使用Ehcache的服务器中,形成集群.如下图所示: Ehcache支持多种集群方式,下面以RMI通信方式为例,来具体分 ...

  8. 动手实现linux中的cp命令(可自行拓展)

    我们在学习系统编程的时候,一定会有这样的经历,让你动手实现一个简单的cp命令,也就是拷贝相应的文件到对应的目录,或者说是复制吧,当然,实现非常的简单,我们来看看源码吧: #include <st ...

  9. Docker教程:docker远程repository和自建本地registry

    http://blog.csdn.net/pipisorry/article/details/50814307 Docker有一个类似版本管理仓库(Repositry)的东西,有docker.io提供 ...

  10. 编译Android 4.4.2源码

    在之前的文章中,和大家分享了在天朝下下载android 4.4.2源码的过程(详见下载android4.4.2源码全过程(附已下载的源码)),现在写下编译的笔记. 虽然在android doc中,有提 ...