射击伤害与重生
成品
UI按钮细节调整
1、按钮按下后消失:
NetWorkManagerUI
:
void Start()
{
hostBtn.onClick.AddListener(() =>
{
NetworkManager.Singleton.StartHost();
DestroyAllButtons();
});
serverBtn.onClick.AddListener(() =>
{
NetworkManager.Singleton.StartServer();
DestroyAllButtons();
});
clientBtn.onClick.AddListener(() =>
{
NetworkManager.Singleton.StartClient();
DestroyAllButtons();
});
}
private void DestroyAllButtons()
{
Destroy(hostBtn.gameObject);
Destroy(serverBtn.gameObject);
Destroy(clientBtn.gameObject);
}
2、按钮右上角对齐
将锚点更改到右上角:
加入玩家
思路:
1. 在Player
中加入Tag,Tag名即为Player
2. 在Player
中加入脚本Player
3. 在GameManager
中创建字典,维护玩家名和玩家实体之间的关系
4. 实现注册和删除函数
a. 用Singleton
实现单例模式
b. 触发实际是在网络连接与断开时OnNetworkSpawn()
和OnNetworkDeSpawn()
注意:每一个client或server都执行同一份
GameManager
代码,所以都有一份字典,且都是通过网络进行同步
运行效果:开一个host一个client,可见每个都有字典Players
射击伤害
流程梳理:player1 hit player2
- player1的client调用
playershooting
里的shoot
RPC函数,server执行该函数 - server的
shoot
函数调用player
里的Takedamage
函数,减少player2的生命值 - 由于player2的生命值是
NetworkVariable
,服务器自动同步到其他client
添加准星
十字准星图片
步骤:
1. Asseet中创建文件夹images,将图片放入文件夹中,改名为 Crosshair
2. 点击 Prefabs->Player->Camera
3. 添加UI->Canvas,命名为 UI
4. 点击刚添加的 UI
, 添加 UI->Raw images,命名为 crosshair
5. 点击 Raw images,图片拖入 Texture 属性
死亡与重生
死亡代码逻辑:
1. 禁用三个组件[PlayerInput,PlayerController,PlayerShooting]和碰撞检测
2. 开启一个异步线程执行重生函数
注意:
在禁用之前先保存原状态
同步问题: ClientRPC调用Die()
函数确保客户端同步,Server端单独执行一遍
重生代码逻辑:
1. 延迟3s
2. 执行SetDefault重新恢复状态
3. 设置坐标,从空中落下表示重生
注意:
修改一个东西的时候想清楚是谁控制的,NetWorkVariable是Server控制的,所以要改Server,而此时玩家移动是LocalPlayer控制的,因此判断
IsLocalPlayer
完整代码
见y总打卡