Unity 2D游戏开发案例学习——Robble Swifthand(下)

10 2D灯光效果(法线贴图)

在这一节中,我们为场景添加一些装饰物件以及对应的灯光效果

添加火炬以及灯光

打开Props资源文件夹,找到我们需要的火炬预制体 Wall Torch,将父级火炬本身以及子物体所带的粒子效果的 Sorting Layer 属性修改到 Background 层级
在这里插入图片描述
将火炬放置在场景的适宜位置,可以看到火炬的效果:
在这里插入图片描述
此时的火炬只有本身的特效播放,但并没有对应的灯光效果。我们需要为之添加 Point Light
在这里插入图片描述

为场景添加材质

但在设置了点光源后,我们的场景并没有被光线照亮,仅有火炬本身有点光源的效果。这是因为场景没有赋予材质来实现与光线的交互。因此我们需要为场景添加法线贴图
我们可以在 Level -> Materials中找到已经制作完成的材质球(也可也新建材质球从Texture文件夹中选取对应 normal map 自行制作),然后对应赋给Tilemap
在这里插入图片描述
可以看到场景可以和我们设置的点光源发生交互了,一些材质也有了特殊的发光效果

添加更多种类的灯光

我们可以在Props中添加另一种光源 Hanging Lamp ,这是一种墙壁挂灯,配置了左右晃动的动画效果,自带的点光源添加了Cookie而实现了十字遮蔽的灯光
在这里插入图片描述
(值得一提的是,这个遮蔽效果会和其他光源产生冲突)

使用 Lighting Settings 设置调整整个场景亮度

从菜单栏的 Window -> Rendering -> Lighting Settings 唤出 Lighting Settings窗口,通过 Environment Lighting 下的 Ambient Color 属性来调整整个场景的曝光度和色调
在这里插入图片描述

补充:

1.我们可以在 Scipts 文件夹中找到 EmissionPulse 脚本,将之挂载到 Background Details 上,启动游戏后可以看到场景中的部分物件自带的光亮渐隐渐现
(假装有GIF)

11 角色动画(Blend Tree)

在这一节中,我们为角色的动作添加动画效果

导入角色模型

在 Robbie 文件夹中,我们可以找到预制体 Robbie_Body ,这是已经准备好了材质和动画状态机的角色模型,包含有身体各个部分的骨骼。我们将模型拖入场景中原先用于替代角色的 Robbie 贴图下,取消 Robbie 的 Sprite Renderer 组件勾选,即可将贴图替换为导入的模型使用了
这里需要注意,角色模型的各个部分的 Sorting Layer 默认为 Default ,如果要角色正确的显示,则需要统一修改到 Player 或调整 Default 的层级

添加动画效果

我们需要打开 Animation 窗口和 Animator 窗口来为角色添加动画
在Animator中,我们可以看到需要的参数和动画的切换条件,在Animation窗口中也可以看到准备好的各个动画
在这里插入图片描述
我们只需要完成控制动画切换的代码就可以使角色动画正常播放

通过 Blend Tree 控制跳跃动画

角色的跳跃动画并未被添加到状态机中。这部分需要我们手动完成
打开 Robbie -> Animation -> Mid Air 文件夹,可以看到角色的跳跃动画一共有七个片段,分别对应跳跃过程中的不同阶段
在状态机中,我们使用 **Blend Tree(混合树)**以及一个 Float 的 Parameter ,verticalVelocity,即竖直方向上的速度,来控制其所处的动画阶段
打开混合树 Mid Air ,在右侧将我们需要的动画片段添加进去,并设置好 verticalVelocity 作切换判据:
在这里插入图片描述
这一系列动画中,1到3是跳起时的动画,5到7为下落时的动画,我们据此设置每个片段的 threshold
在这里插入图片描述

动画切换控制

新建脚本 PLayerAnimation ,挂载在 Robbie_Body 下
具体代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerAnimation : MonoBehaviour
{
   
	Animator anim;
	PlayerMovement movement;
	Rigidbody2D rb;

	//通过Parameter ID进行赋值(部分平台使用字符型传递时可能出现问题)
	int speedID;
	int groundID;
	int crouchID;
	int hangingID;
	int fallID;
	private void Start()
	{
   
		anim = GetComponent<Animator>();
		movement = GetComponentInParent<PlayerMovement>();
		rb = GetComponentInParent<Rigidbody2D>();

		//获取Parameter ID
		groundID = Animator.StringToHash("isOnGround");
		hangingID = Animator.StringToHash("isHanging");
		crouchID = Animator.StringToHash("isCrouching");
		speedID = Animator.StringToHash("speed");
		fallID = Animator.StringToHash("verticalVelocity");

	}
	private void Update()
	{
   
		//anim.SetFloat("speed", Mathf.Abs(movement.xVelocity));
		anim.SetFloat(speedID, Mathf.Abs(movement.xVelocity));
		anim.SetBool(groundID, movement.isGround);
		anim.SetBool(hangingID, movement.isHanging);
		anim.SetBool(crouchID, movement.isCrouch);
		anim.SetFloat(fallID, rb.velocity.y);
	}
}

( PlayerMovement 脚本中的 vVelocity 需要修改为 public 变量)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值