统一使用新输入系统
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
using FishNet.Object;
|
||||
using UnityEngine;
|
||||
using UnityEngine.InputSystem;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
namespace Agame
|
||||
{
|
||||
/// <summary>
|
||||
/// 按攻击键在当前位置生成一个方块,生成动作经 ServerRpc 在服务端执行。
|
||||
///
|
||||
/// 输入来自 Player 根节点上 PlayerInput 的 Attack 动作 —— 与 <see cref="PlayerController"/>
|
||||
/// 共用同一个 PlayerInput(因此 PlayerInput 的启用/禁用也统一由 PlayerController 按所有权管理,
|
||||
/// 这里只读动作,不再自己 enable 组件)。
|
||||
/// </summary>
|
||||
public class PlayerCubeCreator : NetworkBehaviour
|
||||
{
|
||||
[Tooltip("要生成的方块预制体。必须已登记进 FishNet 的可生成预制体列表(DefaultPrefabObjects)。")]
|
||||
[FormerlySerializedAs("CubePrefab")]
|
||||
[SerializeField] private NetworkObject cubePrefab;
|
||||
|
||||
private InputAction _attackAction;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
// Awake 中不得访问 IsOwner,这里只做纯本地缓存。
|
||||
_attackAction = PlayerInputNames.Resolve(GetComponent<PlayerInput>(), PlayerInputNames.Attack, this);
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
// 只让拥有者发起攻击,否则每个客户端都会去指挥别人的玩家造方块。
|
||||
if (!IsOwner)
|
||||
return;
|
||||
|
||||
if (_attackAction != null && _attackAction.WasPressedThisFrame())
|
||||
SpawnCube();
|
||||
}
|
||||
|
||||
[ServerRpc]
|
||||
private void SpawnCube()
|
||||
{
|
||||
if (cubePrefab == null)
|
||||
{
|
||||
Debug.LogError(
|
||||
$"[{nameof(PlayerCubeCreator)}] {name} 的 Cube Prefab 没有指定,无法生成方块。",
|
||||
this);
|
||||
return;
|
||||
}
|
||||
|
||||
NetworkObject obj = Instantiate(cubePrefab, transform.position, Quaternion.identity);
|
||||
Spawn(obj); // NetworkBehaviour 对 ServerManager.Spawn 的快捷封装
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user