【此包装将包括】
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时候调用,方式也和上面一样。