Unity联机游戏如何实现粒子动画同步?一种基于Photon PUN2的网络游戏常用组件封装包

【此包装将包括】

Photon PUN2 C#(Unity)SDK

一个粒子动画同步组件 PhotonParticleSystem.cs

一个云变量组件CloudVariable.cs

伤害计算低级API DamageRequest.cs

伤害计算高级API DemoBattleScript.cs

【使用的前置条件】

需要学会使用Photon PUN2

需要有自己的Photon PUN2 Appid并申请中国的光子云或者部署专用服务器

【用法指导】

1、开发环境的配置:最好使用Unity2022.2.15版本

在PhotonIanPlus/Photon/PhotonUnityNetworking/PhotonServerSetting中

将AppIdPUN一栏清空填上自己的ID

2、PhotonParticleSystem的使用方式

确保在对应物体上已经添加PhotonView和ParticleSystem后,添加PhotonParticleSystem(在菜单Effects里面)组件

并在编辑器ParticleSystem选项中绑定对应的粒子系统

则可实现粒子动画同步的暂停、播放、停止、清理,其代码如下

public class example:Monobehavior{
    public PhotonParticleSystem pp;
    void Example(){
        pp.Pause();
        pp.Stop();
        pp.Play();
        pp.Clear();
                   }
}

其中括号里不填是默认所有玩家的客户端都放映粒子动画

而其中可以填写RpcTarget或Player来指定玩家播放动画

如:

pp.Play(RpcTarget.All);
pp.Play((Player)player);

3、CloudVariable的用法

首先,在需要使用云变量的物体上挂载一个CloudVariable组件

其次,云变量可以通过PhotonStream网络同步传输,实现所有客户端变量同步

可以用作:血量显示、玩家头顶昵称显示

在需要进行云变量同步传输的脚本中,首先定义一个云变量的引用

public CloudVariable variable;
//or
private CloudVariable variable;

void Awake(){//或者Start()
variable=GetComponent<CloudVariable>();
}

对于云变量的设定

//你既可以
variable.cloudVariable=xxx;
//也可以
variable.Set(xxx);

对于云变量的读取

//获取云变量的值,返回一个Object
object buff = variable.Get();

//获得一个云变量的整数值
int iVal = variable.IntValue();
//或者也可以
iVal = Convert.ToInt32(cloudVariable)

//获得一个浮点值
float fVal = variable.FloatValue();
//或者也可以
fVal = (float)Convert.ToDouble(cloudVariable);

//获得一个云变量的字符串形式
int iVal = variable.toString;

//将云变量转化为向量或其他
Vector3 v3 = (Vector3) object;
OtherType Var = (OtherType) object;

//注意传输的object必须是Photon可序列化传输的(详情请上网搜索)

//获得云变量类型
Type t = variable.GetType();







云变量的比较

转化,再比较

//例如
int Myint=xxx;
//int类云变量,获取Int值再比较
if(variable.IntValue()==Myint){
//do something
}

4、聊天系统

有一个ChatManager预制件

将其拖到一个有效的UIcanvas下即可使用

在ChatManager的UI中,左上角下拉框选择是聊天还是命令模式

聊天模式:

点击confirm发送聊天内容

挂载的ChattingSystem脚本有一个方法shutup,就是将当前玩家禁言

想要和某人私聊的格式为:@+somebody+空格+message

命令模式:

请打开脚本,编辑方法Parse()方法来解析命令,可以是房间管理、传送、物品给予等

5、战斗系统

## 低级API——随机数请求脚本

原理:通过向主客户端提交rpc请求并收到返回

将DamageRequest放置到一个有PhotonView的物体上,这个物体最好是造成和承受伤害的物体

为了游戏的公平性和云存档的方便,你最好再准备一个专用服务器或者web接口,推荐使用PlayFab

创建这个房间的客户端向服务器请求一个随机数并返回,获得DamageRequest的引用后

(具体提交请求和得到反馈的代码格式依据你的服务器而定)

//控制角色的代码
public class example:MonoBehavior{

public DamageRequest damageRequest;//获得组件的引用

void RequestRandom(){
//在这里填写向服务器请求随机数种子的逻辑
}

//得到服务器的请求后回调
void OnRandomFeedBack(Result result){
damageRequest.initialize(result.randomseed)
//Unity引擎随机数算法都是基本一致的,获得相同的种子,则生成的结果会相对公平。
}

}

绑定收到随机数的方法

damageRequest.OnRandomFeedback = (int a)=>{
//这里编写你受到随机数的逻辑
};
//或

void onRandomFeedback(int i){
//do something
}

damageRequest.OnRandomFeedback=onRandomFeedback;

## 高级API——战斗系统脚本

需要一个DamageRequest和PhotonView组件,并且房间创立者必须像上述的一样进行初始化

在上面相同的菜单路径中,找到DemoBattleScript脚本,添加到角色上

当自己的技能、武器碰撞到另一个玩家的角色时,调用一个LaunchABattle接口,其中传入受到碰撞的角色对应的玩家

DamageRequest r;//先获得请求伤害低级API引用
//技能碰撞后
void OnCollisionEnter(Collider other){
//获取角色对应的玩家的方法,用photonview类的owner
Player p = other.gameObject.GetComponent<PhotonView>.Owner;
//伤害将作用于这个对象
r.LaunchABattle(p);
}

填入攻击力、防御力、暴击率、暴击伤害则可以自动将伤害作用于对方

伤害算法采取市面上最流行算法:

输出伤害=是否暴击?(100+暴击伤害)/100*攻击力:攻击力

受到伤害=(防御力常数/防御力+防御力常数)*伤害

防御力常数默认设置为1000

如果需要修改游戏规则,可以自己打开脚本修改

还提供三个回调接口

ShowUI:攻击者调用函数,比如说显示产生了多少伤害的数值

//攻击动画器上挂上脚本
public example:MonoBehavior{

public DemoBattleScript bs;

void Start(){
bs.ShowUI=(object[] parametres)=>{

}
bs.ShowUIParams=new object[]{....}
//调用ShowUI方法将传入ShowUIParams作为参数
}
}

HurtingAnimation:受到伤害时调用这个函数,方式和上面一样

OnBloodRunOut:血量小于0时候调用,方式也和上面一样。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值