【Unity3D-Mirror多人坦克大战】编写物品基类、生命盾牌物品功能实现(十)

34、物品基类

新建Powerup.cs,并添加代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
public class Powerup : NetworkBehaviour
{
    // mirror将NetworkInstanceId替换成uint
    [HideInInspector] [SyncVar] public uint parentID;
    private ObjectSpawner spawner;
    public override void OnStartClient()
    {
        // 找到物品
        GameObject parentObj = NetworkIdentity.spawned[parentID].gameObject;
        spawner = parentObj.GetComponent<ObjectSpawner>();
        spawner.obj = gameObject;
    }
    private void OnTriggerEnter(Collider other)
    {
        if (!isServer) return;
        GameObject obj = other.gameObject;
        Player player = obj.GetComponent<Player>();
        if (player == null) return;
        if(Apply(player)) spawner.Destroy();
    }
    
    public virtual bool Apply(Player p)
    {
        return false;
    }
    
}
在ObjectSpawner.cs更新代码
using System.Collections;
using UnityEngine;
using Mirror;
public class ObjectSpawner : NetworkBehaviour
{
    ……
    [Server]
    public void Instantiate()
    {
        obj = Instantiate(prefab, transform.position, transform.rotation);
        obj.GetComponent<Powerup>().parentID = GetComponent<NetworkIdentity>().netId;
        NetworkServer.Spawn(obj);
    }
    ……
}

35、生命恢复物品功能编写

新建PowerupHealth.cs,并添加代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PowerupHealth : Powerup
{
    public int amount = 5;
    public override bool Apply(Player p)
    {
        if (p.health == p.maxHealth) return false;
        int value = p.health;
        value += amount;
        value = Mathf.Clamp(value, value, p.maxHealth);
        p.health = value;
        return true;
    }
    
}
在Powerup.cs更新代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;
public class Powerup : NetworkBehaviour
{
    ……
    private void OnTriggerEnter(Collider other)
    {
        if (!isServer) return;
        GameObject obj = other.gameObject;
        Player player = obj.GetComponent<Player>();
        if(Apply(player)) spawner.Destroy();
    }
    
    public virtual bool Apply(Player p)
    {
        return false;
    }
    
}

36、盾牌UI的制作

将CircleEmpty贴图加入资源
在Player预制体中创建Shield画布
在Shield下创建Slider,并只保留fill
设置Slider
设置fill

测试

37、盾牌物品的功能实现

新建PowerupShield.cs,并添加代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PowerupShield : Powerup
{
    public int amount = 3;
    public override bool Apply(Player p)
    {
        if (p.shield == amount) return false;
        p.shield = amount;
        return true;
    }
}
在Player.cs更新代码
using System;
using UnityEngine;
using UnityEngine.UI;
using Mirror;
public class Player : NetworkBehaviour
{
    ……
    public Slider shieldSlider; // 护盾
    ……
    [HideInInspector] [SyncVar(hook = nameof(OnShieldChange))] public int shield = 0;
    ……
    
    [Server]
    public void TankDamage(Bullet bullet)
    {
        if (shield > 0)
        {
            shield--; // 一炮的伤害为3,刚好把护盾抵消一格
            return;
        }
        ……
    }
    ……
    
    protected void OnShieldChange(int oldValue, int newValue)
    {
        shield = newValue;
        shieldSlider.value = shield;
    }
    
    ……
}

测试

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~Lomiss~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值