Unity开发——好用的数值概率公式

26 篇文章 5 订阅
25 篇文章 1 订阅
1、血量、伤害两个因素作用,击杀目标

正常状态下:hp -= attackValue;

特殊状态下:attackValue *=2;        //伤害翻倍

如飞机/坦克大战中,击杀对方;受到伤害时,装备道具磨损失效;

public int hp=10;
private bool isDebuff;

public void AttackEnemy(int attackValue)
{
    if (isDebuff) attackValue *= 2;
    hp -= attackValue;
    if (hp <= 0) isDead = true;
}

--*************************************************************************************************--

2、血量(不可变)、伤害、以及随机成功概率三个因素作用,概率性击杀目标

伤害数值设计思路:

targetRate是随机出来的此次目标概率;hp越大越难,attackValue越大越容易;

若各因素叠加后的概率大于目标概率,则能击杀成功。

随机数:targetRate = Mathf.Floor(Random.Range(0,100));

公式1:if (targetRate <=( 50-(hp-attackValue)  )/2 ){isOk = true;}    50表示基础概率;

公式2:if (targetRate <= attackValue*3 - hp/10){isOk = true;}

如捕鱼达人中每次成功攻击鱼时捕获成功的概率;

private bool isOk = false;
public int hp =10;

public void CatchItem(int attackValue){

        int targetRate = Mathf.Floor(Random.Range(0,100));//随机出此次目标概率

        if (targetRate<=(50-(hp-attackValue))/2){
            isOK = true;
        }

        if (targetRate<= attackValue*3-hp/10){
            isOK = true;
        }
}

--**********************************************************************************************--

3、物体的位置,抖动系数确定震动随机范围,实现自然的随机震动

震动大小:andom.Range(0f, 振动系数) - 振动系数* 0.5f

震幅衰减:震动系数= 震动系数 / 1.05f;

停止震动:if ( 震动系数<0.05f )  { 震动系数=0; }

如:被攻击时,画面/玩家晃动。

using UnityEngine;
 
/// <summary>
/// 被攻击时,玩家产生的震动方法
/// </summary>
public class Shake : MonoBehaviour
{
    public bool isShake= false;                     //是否允许震动
    private float shakeRate = 5;                    //震动系数
 
    void Update()
    {
        if (isShake)
        {
            //x方向移动
            transform.position = new Vector3((Random.Range(0f, shakeRate)) - shakeRate * 0.5f, transform.position.y, transform.position.z);
            //z方向移动
            transform.position = new Vector3(transform.position.x, transform.position.y, (Random.Range(0f, shakeRate)) - shakeRate * 0.5f);
 
            shakeRate = shakeRate / 1.05f;        //减小振幅
 
            if (shakeRate < 0.05f)                //振幅过小时,停止被撞击效果
            {
                shakeRate = 0;                    //振幅系数置0
                isShake= false;                   //禁止震动
            }
        }
        else shakeRate= 5;                        //不需要震动时,把震动系数还原
    }
}

数值计算参考来源:siki学院课程

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值