PUN ☀️九、玩家网络实例化与昵称显示

简介: PUN ☀️九、玩家网络实例化与昵称显示

🟥 目标

1️⃣ 玩家网络实例化

即把玩家要操控的角色生成出来。GameManager里面Start时实例化角色。


2️⃣ 实现战斗数据不重置

原先只有两个人,再加入一个人,会切换到3人的场景。但原先的两个人当前战斗数据会被重置,这是不合理的。

我们来让之前的玩家数据不被重置。

a、PlayerManager 声明的静态字段LocalPlayerInstance 记录本地玩家实例化的。

Awake赋值,并在加载新场景时,不销毁当前角色。

b、但在重新加载新场景时,GameManager 脚本 Start时会再次实例化角色,于是一个玩家就有了两个角色。所以GameManager Start时根据判断 LocalPlayerInstance 是否为空,确定是否已经实例化了角色。


3️⃣ 位置重置

若从3人房切换到2人房,房间变小了。若切换后原先在地面上的角色悬空了,会出Bug。

所以增加判断:若切换后没踩在地板上,则位置回到出生位置(原点高空)。

方法:PlayerManager 脚本Start时增加加载完场景时的委托,增加的委托事件判断当前角色位置


4️⃣ 激光碰撞判断

解决当跳跃时触发激光,会造成自身减血的现象。

这是因为激光与自身角色控制器的触发器检测碰撞了,我们要检测激光不是接触的自身才行,避免自己碰撞掉血。解决办法:

  • 设置自身的Tag,触发检测Tag再决定是否减血。
  • PlayerManager脚本判断射线碰撞到的角色是否是自己,不是的话再减血(此处采用)
if (other.GetComponentInParent<PhotonView>().IsMine)
    return;
 
Health -= 0.1f;

现在我们可以测试看看,如果发现连接不上,就换成中国区Appid试试,我隔了一天申请通过了,现在你申请的应该也好了。


🟧 代码编写

🚩 PlayerManager

using UnityEngine;
using Photon.Pun;
 
public class PlayerManager : MonoBehaviourPunCallbacks, IPunObservable
{
    #region Parameters
 
    public GameObject beams;
 
    //记录本地玩家实例化
    public static GameObject LocalPlayerInstance;
 
    public float Health = 1f;
 
    //当用户开火时,为True
    bool IsFiring;
 
    #endregion
 
 
    #region Mono CallBacks
 
    void Awake()
    {
        beams.SetActive(false);
 
        if (PhotonNetwork.IsConnected == true && photonView.IsMine)
            LocalPlayerInstance = gameObject;
 
        DontDestroyOnLoad(gameObject);
    }
 
    void Start()
    {
        //当重新加载场景时,检测改脚本所赋值的角色是否踩在空中,若是,则回到出生点重新降落。
        UnityEngine.SceneManagement.SceneManager.sceneLoaded += OnSceneLoaded;
 
        if (PhotonNetwork.IsConnected && photonView.IsMine)
            GetComponent<Skode_CameraWork>().OnStartFollowing();
    }
 
    void Update()
    {
        if (Health <= 0f)
            GameManager.ins.Skode_LeaveRoom();
 
        if (PhotonNetwork.IsConnected == true && photonView.IsMine)
            ProcessInputs();
 
        if (IsFiring != beams.activeSelf)
            beams.SetActive(IsFiring);
    }
 
    void OnTriggerEnter(Collider other)
    {
        if (!photonView.IsMine && !other.CompareTag("beam"))
            return;
 
        Health -= 0.1f;
    }
 
    void OnTriggerStay(Collider other)
    {
        if (!photonView.IsMine && !other.CompareTag("beam"))
            return;
 
        //乘以增量时间,防止因为帧率FPS不同,扣血不同(举例:不乘,每帧执行一次扣血,卡的人比流畅的人扣血少)
        Health -= 0.1f * Time.deltaTime;
    }
 
    #endregion
 
 
    #region PUN CallBacks
 
    public override void OnDisable()
    {
        base.OnDisable();
        UnityEngine.SceneManagement.SceneManager.sceneLoaded -= OnSceneLoaded;
    }
 
    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
        {
            // 我们拥有这个角色:把我们的数据发送给其他人
            stream.SendNext(IsFiring);
            stream.SendNext(Health);
        }
        else
        {
            // 网络角色,接收数据
            IsFiring = (bool)stream.ReceiveNext();
            Health = (float)stream.ReceiveNext();
        }
    }
 
    #endregion
 
 
    #region Private Methods
 
    void OnSceneLoaded(UnityEngine.SceneManagement.Scene scene, UnityEngine.SceneManagement.LoadSceneMode loadingMode)
    {
        CalledOnLevelWasLoaded(scene.buildIndex);
    }
 
    void CalledOnLevelWasLoaded(int level)
    {
        // 检查我们是否在竞技场外面,如果是这样,移动到竞技场中心的安全地带
        if (!Physics.Raycast(transform.position, -Vector3.up, 5f))
        {
            transform.position = new Vector3(0f, 5f, 0f);
        }
    }
 
    void ProcessInputs()
    {
        //鼠标左键
        if (Input.GetButtonDown("Fire1"))
            IsFiring = true;
 
        if (Input.GetButtonUp("Fire1"))
            IsFiring = false;
    }
 
    #endregion
}


🚩 GameManager

using UnityEngine.SceneManagement;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
 
public class GameManager : MonoBehaviourPunCallbacks
{
    public static GameManager ins;
 
    [Tooltip("用来代表玩家的预置体")]
    public GameObject playerPrefab;
 
 
    #region Mono CallBacks
 
    private void Awake()
    {
        ins = this;
    }
 
    private void Start()
    {
        //若本地玩家第一次进游戏场景,还未生成角色,则生成一个。
        //且这个角色通过使用PhotonNetwork.Instantiate进行同步
        if (PlayerManager.LocalPlayerInstance == null)
            PhotonNetwork.Instantiate(playerPrefab.name, new Vector3(0f, 5f, 0f), Quaternion.identity, 0);
    }
 
    #endregion
 
 
    #region Public Methods
 
    //离开服务器房间Btn
    public void Skode_LeaveRoom()
    {
        //不允许主客户端离开房间
        if (!PhotonNetwork.IsMasterClient)
            PhotonNetwork.LeaveRoom();
    }
 
    #endregion
 
 
    #region PUN Callbacks
 
    /// <summary>
    /// 本地玩家离开服务器房间时回调
    /// </summary>
    public override void OnLeftRoom()
    {
        // 加载大厅场景
        SceneManager.LoadScene(0);
    }
 
    /// <summary>
    /// 其他玩家连接房间时的回调(不是自己)
    /// </summary>
    public override void OnPlayerEnteredRoom(Player other)
    {
        print(other.NickName + "    加入房间");
 
        //根据当前玩家的人数,主客户端加载对应场景
        if (PhotonNetwork.IsMasterClient)
            LoadArena();
    }
 
    //当玩家离开房间或变得不活动时调用。
    public override void OnPlayerLeftRoom(Player other)
    {
        print(other.NickName + "    离开了房间");
 
        //根据当前玩家的人数,主客户端加载对应场景
        if (PhotonNetwork.IsMasterClient)
            LoadArena();
    }
 
    #endregion
 
 
    #region Private Methods
 
    void LoadArena()
    {
        //Photon分为主客户端、其他客户端。只有主客户端才可进行加载房间。
        //根据当前房间人数加载对应场景。该方法会使其他玩家会自动加入主客户端的房间
        PhotonNetwork.LoadLevel("Room for " + PhotonNetwork.CurrentRoom.PlayerCount);
    }
 
    #endregion
}


🟨 血条、昵称显示

1、创建UI

在人物下创建3D Slider血条,并且有文本框用于显示名字。

若是滑动条即使是满值也不到头,只需改下滑动条下Fill Area 的 Right值就好了。

2、代码赋值

将下代码挂到机器人身上,并赋值。

using UnityEngine;
using UnityEngine.UI;
 
public class PlayerUI : MonoBehaviour
{
    #region  Parameters
 
    [Tooltip("显示玩家名字的UI文本")]
    public Text playerNameText;
 
    [Tooltip("健康值Slider")]
    public Slider playerHealthSlider;
 
    [Tooltip("用于获取生命值赋值给血条")]
    public PlayerManager target;
 
    #endregion
 
 
    #region Mono Callbacks
 
    void Start()
    {
        playerNameText.text = target.photonView.Owner.NickName;
    }
 
    void Update()
    {
        playerHealthSlider.value = target.Health;
    }
 
    #endregion
}

若现在还没把机器人放到 Resources里,现在就要放进去了。已经放进去的Apply一下。

将 Resources 里的机器人预制体赋值给GameManager,删掉面板的机器人。

各个场景的 GameManager都赋值一下,接下来要进行测试了。

还有,记得关闭离线模式哦


🟩 最终效果展示:

落头上了哈哈

好啦,本系列暂告一段落🧸


相关文章
|
4天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第39天】在数字化时代,网络安全和信息安全成为了我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,帮助读者更好地了解网络安全的重要性,并提供一些实用的技巧和方法来保护自己的信息安全。
15 2
|
5天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第38天】本文将探讨网络安全与信息安全的重要性,包括网络安全漏洞、加密技术和安全意识等方面。我们将通过代码示例和实际操作来展示如何保护网络和信息安全。无论你是个人用户还是企业,都需要了解这些知识以保护自己的网络安全和信息安全。
|
4天前
|
存储 安全 网络安全
云计算与网络安全:探索云服务中的信息安全策略
【10月更文挑战第39天】随着云计算的飞速发展,越来越多的企业和个人将数据和服务迁移到云端。然而,随之而来的网络安全问题也日益突出。本文将从云计算的基本概念出发,深入探讨在云服务中如何实施有效的网络安全和信息安全措施。我们将分析云服务模型(IaaS, PaaS, SaaS)的安全特性,并讨论如何在这些平台上部署安全策略。文章还将涉及最新的网络安全技术和实践,旨在为读者提供一套全面的云计算安全解决方案。
|
4天前
|
存储 安全 网络安全
网络安全与信息安全:漏洞、加密技术与安全意识的交织
【10月更文挑战第39天】在数字化时代,网络安全与信息安全成为保护个人隐私和组织资产的重要屏障。本文将探讨网络安全中的常见漏洞、加密技术的应用以及提升安全意识的重要性。通过具体案例分析,我们将深入了解网络攻击的手段和防御策略,同时提供实用建议,以增强读者对网络安全的认识和防护能力。
|
4天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第39天】在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将探讨网络安全漏洞、加密技术以及安全意识等方面的内容,帮助读者更好地了解网络安全的重要性,并提供一些实用的技巧和建议来保护个人信息和设备安全。
|
7天前
|
SQL 安全 物联网
网络安全与信息安全:深入探讨网络漏洞、加密技术及安全意识###
网络安全与信息安全是当今数字化时代的重要议题。本文将详细探讨网络安全和信息安全的差异,重点介绍常见的网络漏洞、加密技术以及如何提升用户和组织的安全意识。通过具体案例和技术分析,帮助读者理解这些关键概念,并提供实用的建议以应对潜在的网络威胁。 ###
|
7天前
|
安全 网络安全 API
揭秘网络世界的守护神:网络安全与信息安全的深度剖析
【10月更文挑战第36天】在数字时代的洪流中,网络安全和信息安全如同守护神一般,保护着我们的数据不受侵犯。本文将深入探讨网络安全漏洞的成因、加密技术的奥秘以及提升个人安全意识的重要性。通过分析最新的攻击手段、介绍先进的防御策略,并分享实用的安全实践,旨在为读者呈现一个全方位的网络安全与信息安全知识图谱。让我们一同揭开网络世界的神秘面纱,探索那些不为人知的安全秘籍。
25 6
|
5天前
|
存储 安全 网络安全
网络安全与信息安全:从漏洞到加密,保护你的数字生活
【10月更文挑战第38天】在数字化时代,网络安全和信息安全的重要性不言而喻。本文将深入探讨网络安全的漏洞、加密技术以及如何提高个人安全意识,以保护我们的数字生活。我们将通过实际案例,揭示网络安全的脆弱性,并分享如何利用加密技术来保护数据。最后,我们将讨论如何提高个人的安全意识,以防止网络攻击和数据泄露。无论你是IT专业人士,还是普通的互联网用户,这篇文章都将为你提供有价值的信息和建议。
15 3
|
6天前
|
SQL 安全 算法
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第37天】在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的知识,帮助读者更好地了解网络安全的重要性,提高自己的网络安全防护能力。
18 4

热门文章

最新文章