Unity实战
U2D
角色
导入图片 > 纹理类型:Sprite(2D和UI) Sprite模式:单一/多个
输入控制:编辑 > 项目设置 > 输入管理器
输入检测:
1
2
3
var horizontal = Input.GetAxis("Horizontal"); // 有渐变 生输入用GetAxisRaw
var vertical = Input.GetAxis("Vertical");
transform.position += 4.0f * Time.deltaTime * new Vector3(horizontal, vertical);
为了后续支持,我们可以使用新版输入系统: 项目设置 > 玩家 > 其他设置 > 配置 > 活动输入处理 窗口 > 包管理器 > 安装Input System 项目 > 创建 > Input Actions(命名为GameControl
) 并编辑 创建输入映射(命名为Player
) 创建动作(命名为Move
) 对于移动来说 动作类型为Value 控制类型为Vector 2 给动作添加绑定 这里添加上下左右组合体 给四个方向分别绑定 在Input Actions 生成 C# 类 编写代码,命名有对应。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class GameInput : MonoBehaviour
{
private GameControl gameControl;
private void Awake()
{
gameControl = new GameControl();
gameControl.Player.Enable();
}
public Vector3 GetInputMovementDirection()
{
Vector2 inputVector = gameControl.Player.Move.ReadValue<Vector2>();
return new Vector3(inputVector.x, 0, inputVector.y).normalized;
}
}
设定帧率:
1
Application.targetFrameRate = 10;
渲染层级: Sprite Rneder > 其他设置 > 图层顺序:越大越靠前
按y排序层级: 项目设置 > 图形 > 摄像机设置 > 拖名都排序模式:自定义轴 透明度排序轴: (0, 1, 0) Sprite Rneder > Sprite排序点:轴心(pivot) 图片导入时 Sprite编辑器 设置轴心
预制体(Prefab):资源预制,即模板
角色的物理
刚体:Rigidbody 碰撞器:Collider 制止旋转:Rigidbody 2D > Constraints > Freeze Rotation 设置为触发器:Collider > Is Trigger
碰撞检测:
1
2
3
4
5
6
7
8
9
private void OnTriggerEnter2D(Collider2D collision)
{
var luna = collision.GetComponent<LunaController>();
if (luna != null)
{
luna.Change_health(1);
Destroy(gameObject);
}
}
用刚体移动
1
2
3
4
5
private void FixedUpdate()
{
var position = (Vector2)transform.position + walkSpeed * speedMultiplier * Time.fixedDeltaTime * lookDirection;
rigidbody2d.MovePosition(position);
}
检测范围的碰撞器:
1
2
3
4
5
Collider2D collider = Physics2D.OverlapCircle(rigidbody2d.position, 0.5f, LayerMask.GetMask("NPC"));
if (collider != null)
{
// 此处为语法
}
给NPC在检查器里添加Layer。
动画
给角色添加动画控制器(Animator) 挂载控制器文件(*.controller)
打开动画(ctrl+6)和动画器窗口 创建动画(*.anim) 添加要动画的属性 添加关键帧 修改属性值 也可以开启录制模式 拖到相应时间 直接在检查器里修改 简单的可以直接把图片拖到对象上 循环动画在动画的检查器里设置循环 调节速度可以修改采样,或者括起来就可以整体缩放
2D游戏不需要动画之间的过渡 在动画器里删除掉过渡 在动画器里添加状态切换时参考的参数 再检查器里添加切换条件 为了及时应用条件,删除退出时间 多个过渡可以设置优先级
混合树(BlendTree) 设置多个动画的混合
生成物体:
1
2
3
4
5
6
// 在某位置生成
Instantiate(effectGO, transform.position, Quaternion.identity);
// 这是直接给transform 然后把局部位置充值
Instantiate(healEffectGO, transform).transform.localPosition = Vector3.zero;
延迟销毁:
1
Destroy(gameObject, destoryTimeSec);
摄像机
摄像机跟随,安装包: 窗口 > 包管理器 > 安装Cinemachine 在层级中创建Cinemachine > Virtual Camera 在检查器中设置跟随对象 在检查器中设置相机边界 Extensions > Add Extension > Confiner 2D 给地图增加Polygon Collider 2D 设置为触发器 添加给Confiner 2D的Bounding Shape 2D
UI
创建 > UI > 画布(Canvas) Rect Transform:更适合UI的transform Canvas:渲染模式 Canvas Scaler:缩放模式
- 恒定像素大小
- 屏幕大小缩放
- 恒定物理大小
创建 > UI > 图片 子图片的锚点预设 在锚点预设中按下alt可以自动填充
图片、文本、面板等,在Godot里学过了,此处大同小异故,略。 九宫格的背景可以在精灵编辑器里设置border 应用九宫格的图片UI需要在检查器的Image > 图像类型 选择已切片(Tiled) 图片 把大小设置为原始大小:
1
characterImage.SetNativeSize();
UI的类,需要使用:
1
using UnityEngine.UI;
设置血条的函数:
1
2
3
4
5
public void SetHP(float fillPercent)
{
// hpMaskImage是血条遮罩
hpMaskImage.rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, fillPercent * hpBarWidth);
}
DOTween
下载,然后随意拖到工程内
1
using SG.Tweening
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 创建Tween对象
Tween tween = transform.DOMove(target.position, moveTimeSec);
// 默认开启 可以暂停
tween.Pause();
tween.Play();
// 倒着播放
tween.PlayBackwards();
// ease函数
tween.SetEase(Ease.InOutSine);
// 结束后的回调
tween.OnComplete(() => { });
// kill掉tween
tween.Kill();
// tween序列
Sequence sequence = DOTween.Sequence();
sequence.Append(lunaSpriteTransform.DOLocalMoveY(1.5f, 0.25f));
sequence.Append(lunaSpriteTransform.DOLocalMoveY(0.55f, 0.25f));
sequence.Play();
音乐
1
2
3
4
5
6
7
8
9
10
11
12
13
public void playMusic(AudioClip music)
{
if (audioSource.clip != music)
{
audioSource.clip = music;
audioSource.Play();
}
}
public void playSound(AudioClip sound)
{
audioSource.PlayOneShot(sound);
}
U3D
新建工程
模板选择 3D URP(Universal Render Pipeline)即Universal 3D
删掉自带小教程:Readme:Remove Readme Assets 只保留最高质量: 编辑 > 项目设置 > 质量:只保留High Fidelity即可 对应的配置文件也可以删掉 SampleSceneProfile是默认创建的后处理文件 先删掉
后处理
Global Volume:Volume > 配置文件(Profile):创建配置文件 添加覆盖(Add Override) : Tonemapping:色调映射:模式:Neutral Color Adjustments:颜色调整: 泛光(Bloom) Vignette:相机四角的晕影
URP-HighFidelity(URP配置文件) > 质量 > 抗锯齿 在相机 > Camera > 渲染 > 抗锯齿也可以设置,不过我们还是用URP URP-HighFidelity-Renderer > 屏幕空间环境光遮挡(Screen Space Ambient Occlusion)
场景布置
创建 > 3D Object > Plane
中键:平移 右键:移动视角 Alt + 鼠标右键:以固定点旋转 Alt + 鼠标右键:放大缩小 Ctrl + 调整缩放、旋转、平移:以离散单位进行 左上角可以调节增量吸附
修改材质: Mesh Renderer > Material 默认是Lit
角色移动
方向的改变和插值。线性插值用Lerp
,方向向量(球面)差值用Slerp
1
2
3
4
5
transform.position += speed * Time.deltaTime * direction;
if (direction.magnitude > 0.1f)
{
transform.forward = Vector3.Slerp(transform.forward, direction, rotationSpeed * Time.deltaTime);
}