unity实现角色体力功能【体力条+体力计算】

导读:实现功能

1、角色体力计算
2、角色疲劳动画
3、体力条制作、跟随
默认做好角色的idle/run/walk动画、切换和玩家输入,我使用的是新输入系统,动画时单变量混合树,参数Sports。
【每一部分功能根据自己需求观看哦】

1、角色体力计算

实现效果
当角色奔跑时,每秒减少1体力
角色走路时,体力不变
角色站立不动,每秒体力加1体力
玩家体力耗尽,不可移动
(1)新建一个脚本挂载到角色身上

//角色速度设置,根据isRunning来判断角色是否奔跑
private Animator animator;
private Vector2 playerInputVec;
private float walkSpeed = 2.0f;
private float runSpeed = 5.0f;
private float currentSpeed;
private float targetSpeed;
private bool isRuning;
//疲劳值设置
private float minTired = 0.0f;
public float MinTired
{
    get { return minTired; }
}

private float maxTired = 10.0f;
public float MaxTired
{
    get { return maxTired; }
}
private float currentTired;
public float CurrentTired
{
    get { return currentTired; }
}
private float TiredIndex;

void Start()
{
    animator = GetComponent<Animator>();
}

void FixedUpdate()
{
    MovePlayer();
    CalculateTired();
}

 //移动输入,新输入系统获取玩家输入
public void GetPlayerMoveInput(InputAction.CallbackContext context)
{
   playerInputVec = context.ReadValue<Vector2>();//上下左右
}
    
void MovePlayer()
{
    TiredIndex = currentTired >= maxTired ? 0 : 1;
    targetSpeed = isRuning ? runSpeed : walkSpeed;
    targetSpeed *= playerInputVec.magnitude;//当玩家没按下或没有推动摇杆,目标速度为0
    currentSpeed = Mathf.Lerp(currentSpeed, targetSpeed, 0.5f);
    animator.SetFloat("Sports", currentSpeed);
}

//计算体力值,根据当前的速度来判断角色时走还是跑还是站立不动
void CalculateTired()
{
    if (currentSpeed <= walkSpeed && currentTired >= minTired)
    {
        //角色站立不动,疲劳值每秒-1
        currentTired -= Time.deltaTime;
    }
    else if (currentSpeed >= runSpeed && currentTired <= maxTired)
    {
        //角色跑动,疲劳值+1
        currentTired += Time.deltaTime;
    }
    else
    {
        //角色走动,疲劳值不变
        return;
    }
    //将疲劳值限制在最大最小之间
    currentTired = Mathf.Clamp(currentTired, minTired, maxTired);
}

2、角色体力动画

(1)设置动画
打开角色的动画器,点击图层,新建一个图层命名位“States”,该图层来放角色疲惫动画。
在这里插入图片描述
点击新建States层右侧的齿轮,可以看到下面的面板内容
其中的权重:代表该层动画的播放的程度【我们通过将疲劳值与权重相关联来表示角色不同程度的疲惫】
在这里插入图片描述
在下面的Assets中新建一个Avatar遮罩,并命名
在这里插入图片描述
点开新建的遮罩,在右侧选择“人形”(因为是人形动画),我们的疲惫动画只显示在角色的头和躯干,所以只让头和躯干是绿色就可以。
【这里意思是在该层放置的动画只播放躯干和头部的动画,所以选择下面的疲惫动画时建议选择头部和躯干是前后摇动的,显示角色劳累。】
在这里插入图片描述
设置好后,将这个遮罩拖到上面新建States层级的遮罩中,将正在混合设置为Additive【想给角色添加特色但又不取代动画】
在这里插入图片描述
然后将准备好的疲惫动画放到States层的动画器中,要将动画的循环打开。
在这里插入图片描述
这样动画设置好了,接下来通过代码来设置体力值并将体力值与该层的权重相关联。
(2)脚本编写
打开上面的角色脚本,添加如下代码

private int tiredLayerIndex;
//关于TiredWeight根据自己情况设置值
private float TiredWeight = 6.0f;
void Start()
{
    animator = GetComponent<Animator>();
    //获取State动画层级
    tiredLayerIndex = animator.GetLayerIndex("State");
}

在CalculateTired()最后一行添加

//将体力值与播放疲惫动画的权重相关联
    animator.SetLayerWeight(tiredLayerIndex,currentTired/MaxTired*TiredWeight);

3、体力条

实现效果:
消耗体力,体力条出现。疲劳值为零,体力条消失。
跟随
不同疲劳值体力条显示颜色不同

(1)体力条样式制作
【原理,两层sprite,底层是绿色,上层是灰色,随着疲劳值增加,上层的填充从0开始增加到1】

准备一个白色圆环PNG,导入unity,制成Sprite(2D和UI)
在这里插入图片描述
在这里插入图片描述
在unity中创建UI——image,命名PowerBG,在源图像中拖入这个圆环,并把颜色改为绿色
在这里插入图片描述
在该图像下方在新建一个图像,命名ShowPower,将圆环拖进源图像
将ShowPower的图像类型设置为已填充,填充方式Radial 360,填充原点为顶部,填充总数设置为1,不勾选顺时针
在这里插入图片描述
在这里插入图片描述
这样做好了体力条样式
在这里插入图片描述
(2)体力显示,颜色变化
当体力消耗三分之一,体力条变成黄色
当体力消耗三分之二,体力条变成红色
新建一个脚本,挂载到PowerBG上

[SerializeField] 
public Image progressCircle;
public BlackCoatControl showPowerObject;//要显示体力的游戏对象
private float currentTired;
private Image changeColor;
private float changColorIndex=0.3f;

private void Start()
{
    changeColor = this.GetComponent<Image>();
    currentTired = showPowerObject.CurrentTired;
}

private void FixedUpdate()
{
    ToChange();
}

void ToChange()
{
    currentTired = showPowerObject.CurrentTired;
    ToChangeColor();
    progressCircle.fillAmount = currentTired / showPowerObject.MaxTired;
}

//根据体力条不同值,像是不同颜色提示玩家体力耗尽
void ToChangeColor()
{
    if (currentTired>=showPowerObject.MaxTired/3&&currentTired<showPowerObject.MaxTired*2/3)
    {
        changeColor.color = Color.Lerp(Color.green, Color.yellow, 0.7f);
    }

    if (currentTired>=showPowerObject.MaxTired*2/3)
    {
        changeColor.color = Color.Lerp(Color.yellow, Color.red, 0.7f);
    }
}

返回unity,将挂载脚本对象的子物体ShowPower拖到Progress Circle
将游戏对象拖到Show Power Object中
在这里插入图片描述
(3)体力条跟随
新建一个脚本挂载到上面的PowerBG对象上

public Transform followed;
private Vector3 offset;
private Vector3 followedScreen;
private bool isRun;

private void Awake()
{
    //使用协程为了防止当播放画面变化,体力条与人物间距离出现偏差。
    StartCoroutine(Wait());
}

void Update()
{
    if (isRun)
    {
        //将要跟随对象得世界坐标位置转化为屏幕空间
        followedScreen = Camera.main.WorldToScreenPoint(followed.transform.position);
        transform.position = followedScreen;
        transform.position = new Vector2(transform.position.x - offset.x, offset.y);
    }

}

IEnumerator Wait()
{
    yield return new WaitForSeconds(1f);
    followedScreen = Camera.main.WorldToScreenPoint(followed.transform.position);
    offset.x = followedScreen.x - transform.position.x;
    offset.z = followedScreen.z - transform.position.z;
    offset.y = transform.position.y;
    isRun = true;
}

返回unity,将游戏对象或游戏对象的子级拖到Followed中,根据自己想要将体力条放的位置来设置。
在这里插入图片描述
(4)实现玩家消耗体力时,体力条才出现。不消耗时不显示
在玩家脚本中的添加:

public GameObject Show;

void ShowPowerUI()
{
    if(currentTired!=0)
        Show.SetActive(true);
    else
    {
        Show.SetActive(false);
    }
}

void FixedUpdate()
    {
        ShowPowerUI();
        MovePlayer();
        CalculateTired();
    }

返回unity,在里面拖入上面的体力条对象
在这里插入图片描述
最后将PowerBG不显示
在这里插入图片描述
这样就完成了。

内容较多,哪里有问题感谢指出。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 器 Unity 提供了一种叫做 Character Controller 的角色控制器,它可以让你控制你的角色移动,并且可以让你的角色游戏移动和行动。它还可以帮助你处理摩擦和重力,以及其他一些物理系统。 ### 回答2: Unity是一款常用的游戏开发引擎,可以用来实现各种各样的游戏。在Unity角色控制是游戏非常重要的一个部分。下面我将详细介绍如何使用Unity实现角色控制。 首先,我们需要创建一个角色模型。可以使用Unity自带的模型资源,也可以导入自定义的角色模型。将角色模型拖拽到场景,我们可以看到角色出现在游戏场景。 接下来,我们需要给角色添加一个角色控制器组件。在Inspector视图,选择角色模型,在Add Component菜单选择Character Controller。这样就为角色添加了一个角色控制器。 然后,我们需要编写脚本来实现角色的控制。创建一个C#脚本,并将其添加到角色模型上。在脚本,我们可以使用Input类来检测玩家输入,例如按下W键来向前移动,按下S键来向后移动。 在更新函数Update,我们可以根据玩家的输入来控制角色的移动。使用Character Controller提供的Move函数来控制角色的移动方向和速度。例如,通过修改一个Vector3类型的变量来设置角色的移动方向,然后调用Move函数来实现角色的移动。 除了移动,我们还可以通过控制角色的转向来实现角色的旋转。可以使用Transform类的Rotate函数来实现角色的旋转。例如,使用Input.GetAxis函数来获取玩家的鼠标移动,通过修改一个Quaternion类型的变量来设置角色的旋转方向,然后调用Rotate函数来进行角色的旋转。 最后,我们还可以通过添加动画组件来为角色添加动画效果,使得角色在移动和旋转过程能够更加流畅和真实。 通过以上步骤,我们就可以在Unity实现角色控制了。这样,玩家就能够通过键盘和鼠标来控制游戏角色移动和旋转了。Unity角色控制功能可以实现丰富多样的游戏玩法,为游戏开发者提供了很大的灵活性和创作空间。 ### 回答3: Unity是一款强大的游戏开发引擎,可以用来实现角色控制。在Unity角色控制一般通过以下几个步骤来实现: 第一步是导入角色模型和动画资源。通过将模型文件导入到Unity,我们可以获得角色的模型和材质等资源。同时,还需导入角色的动画资源(如动画片段、状态机等),以实现角色的动作控制。 第二步是添加角色控制脚本。我们可以通过编写脚本来控制角色的移动、跳跃、旋转等操作。在脚本,通常会使用Unity提供的CharacterController组件或Rigidbody组件来实现角色的物理模拟和碰撞检测。 第三步是处理角色的输入操作。通过监测用户的输入(如键盘、鼠标或触屏),我们可以控制角色的行为。例如,按下W键可以让角色向前移动,按下空格键可以让角色执行跳跃动作等。 第四步是处理角色的碰撞和触发事件。在游戏角色通常会与场景的物体进行碰撞或触发交互。通过编写碰撞和触发事件的处理函数,我们可以实现角色与环境或其他游戏对象的交互效果。 第五步是调试与优化。在实现角色控制的过程,我们可能会遇到一些问题,例如角色的移动不稳定、碰撞检测不准确等。通过调试和优化脚本代码,我们可以解决这些问题,以获得更好的角色控制效果。 总之,Unity提供了许多工具和组件,可以方便地实现角色控制。通过合理设计角色的模型、动画、输入和物理模拟等,我们可以创造出各种各样有趣的角色控制效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值