文章

Unity实战

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);
}

射线检测

本文由作者按照 CC BY 4.0 进行授权