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
    评论
### 回答1: Unity Timeline 是 Unity 引擎中的一个时间轴工具,它用于创建复杂的、多阶段的动画序列。Unity Timeline 不仅可以实现动画混合,而且还提供了强大的工具和功能来实现动画的各种混合方式。 在 Unity Timeline 中,可以通过添加和编辑各种动画轨道来创建动画序列。每个动画轨道可以含不同的动画剪辑,这些剪辑可以是来自不同的动画片段或者不同的动画控制器。通过将这些动画剪辑串联在一起,就可以实现动画的混合。 Unity Timeline 还支持混合树和混合器,这使得在动画序列中实现复杂的动画混合变得更加容易。混合树可以将多个动画状态和过渡规则组合在一起,使得在不同动作之间平滑过渡变得十分灵活。混合器则提供了一种便捷的方式来控制动画状态之间的混合过渡和权重。 除了基本的动画混合功能外,Unity Timeline 还提供了丰富的转换和修饰器功能,使得动画的混合过程更加精细化和个性化。通过调整过渡曲线、添加淡入淡出效果、调整动画速度等方式,可以实现更加平滑和自然的动画混合效果。 综上所述,Unity Timeline 可以非常方便地实现动画的混合。无论是基本的动画片段串联,还是复杂的动画混合变换,Unity Timeline 都提供了一系列强大的工具和功能来满足开发者的需求。 ### 回答2: Unity Timeline可以实现动画混合。动画混合是指将多个动画片段无缝地连接在一起,以实现更加流畅自然的动画过渡效果。在Unity中,Timeline是一个强大的工具,可以创建和编辑时间轴,控制和混合不同的动画片段。 使用Unity Timeline,我们可以将多个动画状态连接在一起,然后根据指定的规则进行混合。例如,我们可以通过控制时间曲线和变换曲线来制定动画的过渡效果。我们还可以根据需要在时间轴上添加和编辑事件,并进行动画状态之间的补间。 通过Unity Timeline,我们可以实现多种动画混合效果,如淡入淡出、平滑过渡、融合等等。我们可以根据动画状态的优先级、权重、时间曲线等来控制动画的混合效果,实现更加精细的动画控制。 总之,Unity Timeline是一个强大的工具,可以实现动画混合效果。通过使用Timeline,我们可以创建复杂、流畅的动画过渡,并且可以根据需求进行细节调整。无论是游戏开发还是其他领域的动画制作,Unity Timeline都是一个非常有用的工具。 ### 回答3: 是的,Unity Timeline可以实现动画混合。动画混合是指同时播放多个动画,使它们平滑地过渡,并按照一定的权重进行混合。Unity Timeline为开发者提供了一个可视化的时间轴编辑器,可以方便地对动画进行管理和控制。 在Unity Timeline中,我们可以创建多个动画轨道,并在每个轨道上放置不同的动画剪辑。通过设置每个动画剪辑的权重和过渡曲线,可以使动画在时间轴上平滑切换和过渡。开发者可以使用Timeline中的插值器,例如Blend Tree,来控制动画的混合过程,使不同的动画之间实现平滑的过渡效果。 此外,Unity Timeline还提供了灵活的控制选项,比如可以调整动画的播放速度、循环模式、延迟启动等。还可以通过添加事件轨道,在特定的时间点触发脚本事件,实现更高级的交互和逻辑控制。 总的来说,Unity Timeline是一个强大的工具,可以帮助开发者实现复杂的动画混合效果,使游戏或应用程序中的角色和场景动画更加丰富和流畅。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值