框架
using System;
using System.Collections.Generic;
using ExitGames.Client.Photon;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
using Random = UnityEngine.Random;public class PunDemo : MonoBehaviourPunCallbacks
{public GUISkin skin;#region GUI Values//状态滚动视图值private Vector2 stateScrollViewValue;//滚动视图值private Vector2 scrollViewValue;//状态更新日志private string clientStateLog;//房间名称private string roomNameValue;//房间最大人数private string roomMaxPlayerValue;//玩家名称private string playerNameValue;//想要加入的房间名称private string roomName;//是否有密码private bool hasPassword = false;//房间密码private string roomPassword = "";//待输入的房间密码private string inputRoomPassword;//密码错误private bool errorPwd;//玩家颜色private string playerColorValue = "1,1,1";//游戏是否开始private bool gameStart;#endregion//上一次的客户端状态private ClientState previousState = ClientState.Disconnected;private void Start(){roomNameValue = "Room" + Random.Range(10, 100);playerNameValue = "Player" + Random.Range(100, 1000);roomMaxPlayerValue = "8";}private void Update(){//上次的状态跟当前状态进行对象,如果发生变化,记录变化if (previousState != PhotonNetwork.NetworkClientState){clientStateLog += PhotonNetwork.NetworkClientState + "\n";}//将当前状态设置为Previous,以便下一次比对previousState = PhotonNetwork.NetworkClientState;}private void OnGUI(){GUI.skin = skin;//设置标题风格var styleState = new GUIStyleState();styleState.textColor = Color.blue;var style = new GUIStyle();style.fontSize = 120;style.normal = styleState;//标题GUILayout.Label("Client State Log", style);//显示状态日志stateScrollViewValue = GUILayout.BeginScrollView(stateScrollViewValue, GUILayout.Height(300));GUILayout.Label(clientStateLog);GUILayout.EndScrollView();//状态scrollViewValue = GUILayout.BeginScrollView(scrollViewValue);switch (PhotonNetwork.NetworkClientState){//初始状态case ClientState.PeerCreated:PeerCreateState();break;//连接到主服务器状态case ClientState.ConnectedToMasterServer:ConnectedToMasterServerState();break;//加入房间case ClientState.Joined:JoinedState();break;//加入大厅case ClientState.JoinedLobby:JoinedLobbyState();break;}GUILayout.EndScrollView();}private void PeerCreateState(){if (GUILayout.Button("连接主服务器")){//使用配置连接主服务器PhotonNetwork.ConnectUsingSettings();}}private void ConnectedToMasterServerState(){GUILayout.Label("房间名称:");roomNameValue = GUILayout.TextField(roomNameValue);GUILayout.Label("房间最大人数:");roomMaxPlayerValue = GUILayout.TextField(roomMaxPlayerValue);GUILayout.Label("玩家名称:");playerNameValue = GUILayout.TextField(playerNameValue);GUILayout.Label("想要加入的房间:");roomName = GUILayout.TextField(roomName);hasPassword = GUILayout.Toggle(hasPassword, "是否创建密码房间");if (hasPassword){roomPassword = GUILayout.PasswordField(roomPassword, '*');}if (GUILayout.Button("创建房间")){//设置昵称PhotonNetwork.LocalPlayer.NickName = playerNameValue;//创建房间选项对象RoomOptions options = new RoomOptions();//设置房间最大人数options.MaxPlayers = byte.Parse(roomMaxPlayerValue);if (hasPassword){options.CustomRoomProperties = new Hashtable{{"RoomPassword", roomPassword}};//将属性设置为大厅属性options.CustomRoomPropertiesForLobby = new[] {"RoomPassword"};}//创建房间PhotonNetwork.CreateRoom(roomNameValue, options);}if (GUILayout.Button("随机加入房间")){//随机加入房间PhotonNetwork.JoinRandomRoom();}if (GUILayout.Button("加入房间")){//随机加入房间PhotonNetwork.JoinRoom(roomName);}if (GUILayout.Button("随机加入游戏大厅")){//加入大厅PhotonNetwork.JoinLobby();}}private void JoinedState(){int len = PhotonNetwork.PlayerList.Length;GUILayout.Label("-----------------");for (int i = 0; i < len; i++){//获取当前玩家Player player = PhotonNetwork.PlayerList[i];GUIStyle localStyle = new GUIStyle();localStyle.fontSize = 100;if (player.IsLocal){localStyle.normal.textColor = Color.red;}else{localStyle.normal.textColor = Color.green;}if (player.IsMasterClient){GUILayout.Label("【房主】", localStyle);}//声明返回值object getPlayerColor;bool get = player.CustomProperties.TryGetValue("PlayerColor", out getPlayerColor);Color color = Color.white;if (get){try{string colorStr = getPlayerColor.ToString();string[] rgb = colorStr.Split(',');color=new Color(float.Parse(rgb[0]),float.Parse(rgb[1]),float.Parse(rgb[2]));}catch (Exception e){}}var colorStyle=new GUIStyle();colorStyle.normal.textColor = color;colorStyle.fontSize = 100;GUILayout.Box("███████",colorStyle);GUILayout.Label("序号:"+player.ActorNumber,localStyle);GUILayout.Label("昵称:" + player.NickName,localStyle);if (player.IsLocal){GUILayout.Label("请设置玩家颜色",localStyle);playerColorValue = GUILayout.TextField(playerColorValue);if (GUILayout.Button("更改颜色")){Hashtable hashtable=new Hashtable();hashtable.Add("PlayerColor",playerColorValue);//将玩家的颜色作为属性设置到玩家对象中player.SetCustomProperties(hashtable);}}if (i!=len-1){GUILayout.Label("-----------------");}}GUILayout.Label("-----------------");//房主开始游戏if (PhotonNetwork.LocalPlayer.IsMasterClient){if (GUILayout.Button("开始游戏")){Hashtable hashtable=new Hashtable();hashtable.Add("GameStart",true);//设置游戏开始的房间属性广播PhotonNetwork.CurrentRoom.SetCustomProperties(hashtable);}}if (GUILayout.Button("离开房间")){//离开房间PhotonNetwork.LeaveRoom();}}private void JoinedLobbyState(){GUILayout.Label("-----------------");for (int i = 0; i < roomInfos.Count; i++){GUILayout.Label(roomInfos[i].Name + "\t" +roomInfos[i].PlayerCount +"/" + roomInfos[i].MaxPlayers);//声明数值结果object pwdValue;//尝试获取结果bool getValue = roomInfos[i].CustomProperties.TryGetValue("RoomPassword", out pwdValue);if (getValue){GUILayout.Label("请输入密码:");inputRoomPassword = GUILayout.TextField(inputRoomPassword);}if (GUILayout.Button("加入房间")){//如果没有密码if (!getValue || inputRoomPassword == (string) pwdValue){errorPwd = false;//加入这个房间PhotonNetwork.JoinRoom(roomInfos[i].Name);}else{errorPwd = true;}}if (errorPwd){GUIStyle style = new GUIStyle();style.normal.textColor = Color.red;style.fontSize = 100;GUILayout.Label("密码输入错误,无法加入房间!", style);}if (i != roomInfos.Count - 1){GUILayout.Label("-----------------");}}GUILayout.Label("-----------------");if (GUILayout.Button("离开大厅")){//离开大厅PhotonNetwork.LeaveLobby();}}#region Pun Callbacksprivate List<RoomInfo> roomInfos = new List<RoomInfo>();public override void OnRoomListUpdate(List<RoomInfo> roomList){for (int i = 0; i < roomList.Count; i++){if (roomList[i].RemovedFromList){roomInfos.Remove(roomList[i]);}else{roomInfos.Add(roomList[i]);}}}public override void OnLeftLobby(){roomInfos.Clear();}public override void OnRoomPropertiesUpdate(Hashtable propertiesThatChanged){if (propertiesThatChanged.ContainsKey("GameStart")){gameStart = true;//生成玩家PhotonNetwork.Instantiate("Prefabs/Player", new Vector3(Random.Range(-10f, 10),1, Random.Range(-10f, 10)), Quaternion.identity);}}#endregion
}using Photon.Pun;
using UnityEngine;public class PunCallbackbyClass : MonoBehaviourPunCallbacks
{public override void OnConnectedToMaster(){Debug.Log("主服务器连接成功!");}public override void OnCreatedRoom(){Debug.Log("创建房间成功!");}public override void OnCreateRoomFailed(short returnCode, string message){Debug.Log($"房间创建失败【错误编码:{returnCode},错误描述:{message}】");}public override void OnJoinedRoom(){Debug.Log("加入房间成功!");}public override void OnJoinRandomFailed(short returnCode, string message){Debug.Log($"随机加入房间失败【错误编码:{returnCode},错误描述:{message}】");}public override void OnJoinedLobby(){Debug.Log("加入大厅成功!");}
}
控制demo
using System;
using System.Collections;
using System.Collections.Generic;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;public class PlayerController : MonoBehaviourPunCallbacks
{float h;float v;public float speed = 6;public float turnSpeed = 15;Transform camTransform;Vector3 movement;Vector3 camForward;private Color currentPlayerColor;private Animator _animator;private void Start(){//获取当前对象的创建者Player currentPlayer = photonView.Owner;object playerColor;//获取玩家属性,关于颜色bool getColor = currentPlayer.CustomProperties.TryGetValue("PlayerColor", out playerColor);if (getColor){try{string[] color = playerColor.ToString().Split(',');currentPlayerColor = new Color(float.Parse(color[0]),float.Parse(color[1]),float.Parse(color[2]));//变色//GetComponent<MeshRenderer>().material.color = currentPlayerColor;//transform.GetChild(0).GetComponent<MeshRenderer>().material.color = currentPlayerColor;}catch (Exception e){}}if (!photonView.IsMine)return;//设置相机观察目标为当前玩家CameraController.instance.target = transform;camTransform = CameraController.instance.transform;_animator = GetComponent<Animator>();}void Update(){Move();}void Move(){if(!photonView.IsMine)return;h = Input.GetAxis("Horizontal");v = Input.GetAxis("Vertical");//GetComponent<Rigidbody>().MovePosition(transform.position + camTransform.right * h + camForward * v);  transform.Translate(camTransform.right * h * speed * Time.deltaTime + camForward * v * speed * Time.deltaTime, Space.World);if (h != 0 || v != 0){Rotating(h, v);}float move=new Vector3(h,0,v).magnitude;_animator.SetFloat("move",move);if (Input.GetMouseButtonDown(0)){_animator.SetTrigger("attack");}}private void OnCollisionStay(Collision other){if (!photonView.IsMine){return;}if (other.transform.CompareTag("Player")){if (_animator.GetCurrentAnimatorStateInfo(0).IsName("Attack01")){other.transform.GetComponent<Animator>().SetTrigger("gethit");}}}void Rotating(float hh, float vv){if(!photonView.IsMine)return;camForward = Vector3.Cross(camTransform.right, Vector3.up);  Vector3 targetDir = camTransform.right * hh + camForward * vv;  Quaternion targetRotation = Quaternion.LookRotation(targetDir, Vector3.up); transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, turnSpeed * Time.deltaTime);}}using UnityEngine;public class CameraController : MonoBehaviour
{public Transform target;public float xSpeed = 200;public float ySpeed = 200;public float mSpeed = 10;public float yMinLimit = -50;public float yMaxLimit = 50;public float distance = 10;public float minDistance = 2;public float maxDistance = 30;public bool needDamping = true;float damping = 5.0f;public float x = 0.0f;public float y = 0.0f;public static CameraController instance;private void Awake(){instance = this;}void Start(){Vector3 angles = transform.eulerAngles;x = angles.y;y = angles.x;}void LateUpdate(){if (target){if (Input.GetMouseButton(1)){x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;y = ClampAngle(y, yMinLimit, yMaxLimit);}distance -= Input.GetAxis("Mouse ScrollWheel") * mSpeed;distance = Mathf.Clamp(distance, minDistance, maxDistance);Quaternion rotation = Quaternion.Euler(y, x, 0.0f);Vector3 disVector = new Vector3(0.0f, 0.0f, -distance);Vector3 position = rotation * disVector + target.position;//adjust the camera if (needDamping){transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping);transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping);}else{transform.rotation = rotation;transform.position = position;}}}static float ClampAngle(float angle, float min, float max){if (angle < -360)angle += 360;if (angle > 360)angle -= 360;return Mathf.Clamp(angle, min, max);}
}

Photon Pun相关推荐

  1. Unity之使用Photon PUN开发多人游戏教程

    前言 Photon是一个网络引擎和多人游戏平台,可以处理其服务器上的所有请求,我们可以在 Unity(或其他游戏引擎)中使用它,并快速把游戏接入Photon的网络中,而我们就可以专注于在项目中添加逻辑 ...

  2. Photon PUN和Photon Server连接问题及解决方法(Unity开发)

    报错关键词:CENetThreadPool::Process - Exception; Unexpected protocol 相关关键词:Unity:Photon:PUN:MMO 1. 背景 在开发 ...

  3. 【Unity3D插件】Photon Unity Networking(PUN)插件分享《多人联机服务器》

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 Photon Unity Networking (PUN)是一种用 ...

  4. Photon 使用心得

    评价用的不是很爽,但不得不用... 翻译文档:虽让版本很老,但是还是有价值 https://vibrantlink.com/pun_multiplay_manual/?tdsourcetag=s_pc ...

  5. (二)PUN 2基本教程

    一.介绍 PUN 基础教程是一个基于 Unity 的教程.我们将使用 Photon Cloud 开发第一个简单的 PUN 2 多人游戏.目标是同步每个玩家的动画角色.健康值和基本光线投射. 1.概述 ...

  6. Photon:3-游戏场景

    一.创建第一个房间 这里就是创建你自己的游戏场景就好了,比如我这里的 二.Game Manager 预制体 1.创建c# 脚本 'GameManager' 2.创建一个空的gameobject 命名为 ...

  7. Unity 使用Photon Server 联网开发(二)游戏同步+房间列表

    photon联机的配置: 直接去官网下载Pun的资源包导入项目,设置PhotonServerSettings配置文件,配置appid.通讯协议.服务器地址.端口号:服务器地址可以配置成自己本地服务器. ...

  8. Unity+ Photon服务器实时对战游戏——Photon服务器介绍(一)

    最近打算做实时对战的类似lol的游戏,也在学习使用Photon服务器,就分享一下.这可能是一个系列文章.记录一下学习过程,分享一下经验收获. 今天先介绍一下Photon服务器是什么,可以做什么,为什么 ...

  9. 网络游戏源代码分析_为您的游戏选择正确的网络代码

    网络游戏源代码分析 We evaluated and researched today's most popular netcode frameworks for multiplayer games ...

最新文章

  1. 学习OpenCV——配置CUDA环境
  2. MATLAB 练习题 金币
  3. RedisCluster读写分离改造
  4. VS直接调试可执行文件main函数.exe输入参数argc(项目--> 属性--> 调试--> 命令参数)
  5. 笔记本电脑可以做网站服务器,个人笔记本能做网站服务器吗
  6. Java 常用对象-StringBuffer类
  7. linux内核调度算法(2)--CPU时间片如何分配
  8. iPad上浏览超大图像,kakadu和Jpeg2000在iOS上的例程
  9. 虚拟机与主机之间直接复制粘贴文件(最新详细版)
  10. ES3、ES4、ES5、ES6区别
  11. mac上利用openssl命令进行软件安装包的哈希校验
  12. 计算机用户接入广域网的技术,第五章广域网接入技术全解.ppt
  13. 漏洞复现——shiro反序列化
  14. RuntimeError: could not create a descriptor for a dilated convolution forward propagation primitive
  15. vscode如何一键生成vue模板
  16. C++ 算法学习四(直线、抛物线拟合)
  17. python协程的作用_python 协程
  18. 外汇交易策略算法_算法交易策略
  19. mac + iterm + 远程开发 快捷键和工具--戴上手套搬砖
  20. 准备4个月过华为测试岗,拿个23k应该不多吧

热门文章

  1. 不懂带人,你就自己干到死
  2. 谷歌小恐龙-有网也能玩儿
  3. YOLOX的解耦头结构思考
  4. 成功解决:下载的谷歌浏览器,打开却是“2345浏览器”,方法亲测有效
  5. qt 打开exe文件
  6. 【古希腊罗马神话】期末结课论文
  7. 【音频特征】语音特征小结
  8. 快捷安装Mac系统下安装/卸载brew
  9. 设计模式design
  10. 水准路线平差c语言程序,水准网平差程序的设计与实现