• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共151篇

    Unity - 游戏引擎

关闭

返回栏目

关闭

返回Unity - 游戏引擎栏目

67 - 配置 - Player - 客Player.cs所有玩家控制

作者:

贺及楼

成为作者

更新日期:2024-06-06 19:36:53

作用:玩家的动态

包括

本地:C#控制方向、区分自己、别人
联网:客户端—>服务器。双向。Operation。同步位置方法
联网:服务器—>客户端。双向。Operation。其他玩家
联网:—>客户端。单向。Event。新来的玩家
联网:—>客户端。单向。Event。新来的位置数据

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using Common;
  5. using Common.Tools;
  6. public class Player : MonoBehaviour {
  7. public bool isLocalPlayer = true;//房主
  8. public string username;//判断属于哪个用户
  9. public GameObject playerPrefab;
  10. public GameObject player;
  11. private Rigidbody playerRb;
  12. private SyncPositionRequest syncPosRequest;
  13. private SyncPlayerRequest syncPlayerRequest;//玩家信息
  14. private Vector3 lastPosition = Vector3.zero;//前一帧的位置
  15. private float moveOffset = 0.01f;//频率
  16. public float JumpSpeed = 0.1f;//跳跃高度
  17. private Dictionary<string, GameObject> playerDict = new Dictionary<string, GameObject>();
  18. // Use this for initialization
  19. void Start () {
  20. player.GetComponent<Renderer>().material.color = Color.blue;//紫色是本地用户
  21. syncPosRequest = GetComponent<SyncPositionRequest>();
  22. syncPlayerRequest = GetComponent<SyncPlayerRequest>();//获取其他玩家信息
  23. playerRb = player.GetComponent<Rigidbody>();//获得Rigidbody属性
  24. syncPlayerRequest.DefaultRequest();//向服务器请求其他玩家
  25. InvokeRepeating("SyncPosition", 3, 0.02f);//重复调用某个方法,3秒后开始进行同步,同步速率:1秒同步10次写0.1f,一般10-20次
  26. }
  27. //客户端-->服务器。双向。Operation。同步位置方法
  28. void SyncPosition()
  29. {
  30. //判断有没有移动,没有的话就不管了,节约性能
  31. if (Vector3.Distance(player.transform.position, lastPosition) > moveOffset)
  32. {
  33. lastPosition = player.transform.position;//更新这一帧的位置
  34. syncPosRequest.pos = player.transform.position;//新位置信息
  35. syncPosRequest.DefaultRequest();//请求同步位置
  36. }
  37. }
  38. // Update本地操作
  39. void Update () {
  40. if (Input.GetKeyDown(KeyCode.Space)) //按下空格就跳跃
  41. {
  42. playerRb.AddForce(JumpSpeed * Vector3.up);
  43. }
  44. //角色移动
  45. float h = Input.GetAxis("Horizontal");
  46. float v = Input.GetAxis("Vertical");
  47. float height = player.transform.position.y / 100;//获得高度
  48. player.transform.Translate(new Vector3(h, height, v) * Time.deltaTime * 4);
  49. }
  50. //服务器-->客户端。双向。Operation。其他玩家
  51. public void OnSyncPlayerResponse(List<string> usernameList)
  52. {
  53. //创建其他客户端的Player角色
  54. foreach (string username in usernameList)
  55. {
  56. OnNewPlayerEvent(username);
  57. }
  58. }
  59. //-->客户端。单向。Event。新来的玩家
  60. public void OnNewPlayerEvent(string username)
  61. {
  62. GameObject go = GameObject.Instantiate(playerPrefab);
  63. playerDict.Add(username, go);
  64. }
  65. //-->客户端。单向。Event。新来的位置数据
  66. public void OnSyncPositionEvent(List<PlayerData> playerDataList)
  67. {
  68. foreach (PlayerData pd in playerDataList)
  69. {
  70. GameObject go= DictTool.GetValue<string, GameObject>(playerDict, pd.Username);
  71. if(go!=null)
  72. go.transform.position = new Vector3() {x=pd.Pos.x,y = pd.Pos.y,z=pd.Pos.z };
  73. }
  74. }
  75. }