自学UNITY笔记(2D横版平台)

总之学到哪更到哪 ,自己用的笔记所以写得对别人来说会很混乱吧
Up主B站空间
教程游戏代码github地址

  • Lesson1 熟悉界面和加载素材
    默认显示方式
    window -> layout -> default
    SampleScene
    Project -> 文件目录
    Scene ->游戏画面
    asset store -> 素材商店
    下载素材 sunnyland
    shift + sapace 放大窗口

  • Lesson2 加入tilemap素材编辑地图
    网格 Pixel Per Unit改16
    w q e r t y u
    w -> 调整方向
    transform -> reset 还原
    create -> 2D object -> tilemap
    inspector 取消显示
    window -> 2d -> tile palette
    Pixel Per Unit改16
    sprite editor
    sprite mode ->multiple
    //Slice-> autoslice -> slice
    Slice -> grid by cell size 16,16 apply
    笔刷

  • Lesson3 设置图层和碰撞体
    图层排序
    sorting layer
    越在下面,越在前面
    order layer 数字越大越在前2D object -> sprite
    拖拽到 sprite Add Component
    rigibody 2d 2d刚体
    box collider 2d 碰撞体
    tilemap collider 2d 地图碰撞格子
    tilemap collider 2d里可以勾选上composite整合碰撞体(但要事先加入composite collider和rigidbody 2d,其中rigidbody要选为static状态)

  • Lesson4 使2D角色移动
    edit - >projectsetting -> input
    Horizontial 横向
    add Component
    new script
    Assets -> Script -> 放代码
    script文件还要手动拖到对应Sprite里
    移动时会触发Update() 函数

public Rigidbody2D rb; //定义刚体,手动在图形编辑器里拖进去
Input.GetAxis("Horizontal");// 获取横轴变更
rb.velocity = new Vector2(horizontalMove * speed, rb.velocity.y); //设置对象位置

将刚体 Constrants 里的 z 勾选,让它不会飞起来
打印log方式:
Debug.Log(“移动了”);
会在unity编辑器的左下角看到输出在玩游戏时修改参数时,要在齿轮里点 copyComponent

  • Lesson5 角色朝向改变与实现跳跃
    scale 控制方向
float facedirection = Input.GetAxisRaw("Horizontal"); //直接获得 -1,0,1 获取整数
transform.localScale = new Vector3(facedirection, 1, 1);// 设置方向

保证不同帧率正常
Update 函数改为 FixedUpdate() 函数

rb.velocity = new Vector2(horizontalMove * speed * Time.deltaTime, rb.velocity.y); //速度乘以一个时间参数

跳跃

Input.GetButtonDown("Jump") // 获取跳跃按键
rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime); //改变y轴方向

Rigidbody2D 中的GravityScale 参数同样可以调整跳跃力度

  • Lesson6 动画效果制作
    添加文件夹 Assets -> Animation -> Player create AnimationController
    window -> Animation -> Animation 打开动画面板
    Smaples 设置动画速率
    window -> Animation -> Animator
    parameters 设置变化参数
    修改变化箭头
    去掉 Has Exit Time
    Transition Duration 设置成 0
    将Player Animation 加到 Player
    编辑变化代码
public Animator anim;
anim.SetFloat("running", Mathf.Abs(facedirection));
  • Lesson7 跳跃动画 LayerMask
void SwitchAnim()
    {
        // idle先设置成false,毕竟true和false都能触发站立动画,方便修改成true之后能换回false
        anim.SetBool("idle", false);

        if (anim.GetBool("jumping"))    // 判断是否在跳跃状态
        {
            if (rb.velocity.y < 0)      // 判断是否角色正在下落
            {
                anim.SetBool("jumping", false);
                anim.SetBool("falling", true);      // 改为下落状态
            }
        } else if (coll.IsTouchingLayers(ground))   // coll.IsTouchingLayers(ground)判断角色是否碰撞到ground这个物理层(先前地图已设置成ground层)
        {
            anim.SetBool("falling", false);
            anim.SetBool("idle", true);
        }
    }

改变jumping、falling和idle的值改变动画

  • Lesson8 修复移动问题
    问题是在平面移动时会卡住
    解决办法:把player的碰撞体形状改成圆弧为底,推荐胶囊碰撞体

  • Lesson9 镜头控制Cinemachine
    ———这TM是个神器
    1.添加CameraController控制镜头
    2.填加Cinemachine控制镜头
    添加插件 window->PackageManager->Cinemachine
    对背景添加 Polygon Colider2d 勾选isTriger
    Cinemachine Confiner 填入 Polygon
    Lens-> Orthographic Size 镜头大小

  • Lesson10 物品收集 & Perfabs
    1.创建物品的 Object 动画
    2.拾取效果 在 PlayerController void OnTriggerEnter2D(Collider2D collision) 方法里
    注意,物品的istrigger 要勾选上
    3.创建一个Perfabs防止重复利用 object
    4.利用Layer层级调整显示效果

  • Lesson11 物理材质&空中跳跃
    消除摩擦力防止角色卡在墙面,实现空中只能跳一次功能
    1.摩擦导致不落下
    配置没有摩擦的物理效果
    create -> physic Materail 2D Friction 0
    将它设置到Player的 Box Collider 2D
    2 空中跳跃
    根据 coll.IsTouchingLayers(grouder) 判断触地

private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "Collection")
        {
            Destroy(collision.gameObject);
            Cherry += 1;
        }
    }
  • Lesson12 UI入门
    1.添加Canvas ->添加Text
    2.在代码中给Text修改值->赋值用到toString()
    3.锁定UI位置->Text里Rect transform->左上角有个图形

  • Lesson13 敌人Enemy出现
    1.添加敌人sprite,添加Enemy标签
    2.通过 private void OnCollisionEnter2D(Collision2D collision) 防范判断踩到敌人

  • Lesson14 受伤效果
    1.添加碰撞逻辑 , 根据x的大小判断左右
    2.设置弹出 rb.velocity = new Vector2(h, rb.velocity.y);
    3.Mathf.Abs(rb.velocity.x) < 0.1 判断弹出是否结束,isHurt变量设置是否受伤状态
    4.添加受伤动画 hurting 变量切换动画状态 anim.SetFloat(“running”, 0); 结束跑动状态
    遇到问题: 一直滑动,不能停止。
    原因是底下圆形没有摩擦力,在info中可以看到
    通过给底层碰撞体添加带摩擦力的 physicMatal 解决
    (适当调节一下碰撞体位置和大小,让脚底既有摩擦力,又让身子和其他碰撞体不会有摩擦)

  • Lesson15 敌人移动
    1.添加敌人控制代码
    2.给敌人添加左右两个子object确定左右节点
    3.代码中根据左右节点决定转向

  • Lesson16 Animation Events
    Animation窗口 -> 创建animation event节点
    animation event节点可选择包含脚本的函数
    动画播放经过节点时能调用该节点

  • Lesson17 Class调用(互动包括老鹰制作)
    1.老鹰制作
    防止横向移动 锁死Rigidbody2D
    上下移动的方式 上下设置各设置一个emptyobject
    2.死亡动画
    将死亡销毁放到动画结束帧上
    3.公用死亡代码
    创建父类enemy,敌人类都继承他,在父类中实现加载代码和死亡代码
    父类可继承方法写法 protected virtual void Start(){}
    子类重载写法

protected override void Start()
{
base.Start()
}

向下转型写法:

Enemy enemy = collision.gameObject.GetComponent();
  • Lesson18 音效Audio
    添加AudioSource
    代码实现特定情况播放音效:某一AudioSource.Play();

  • Lesson19 对话框Dialog
    添加UI ->Panel
    布局
    添加 text
    字体
    围绕中心点拖动大小 option+拖动
    触发Dialog
    添加boxCollider -> isTrigger
    添加代码
    EnterDialog
    player添加 tag

public GameObject enterDialog; //门
OnTriggerEnter2D //碰撞事件
OnTriggerExit2D //离开事件

制作动画
add Animation
点击录制按钮,设置不同帧的样式。

  • Lesson20 趴下效果
void Crouch()
    {
    	// 碰撞体低于该监测点时,角色所处位置不允许站立
        if (!Physics2D.OverlapCircle(cellingCheck.position, 0.2f, ground))
        {
            if (Input.GetButton("Crouch"))
            {
                anim.SetBool("crouching", true);
                // 不启用站立时多余的碰撞体,使蹲下时只启用小碰撞体
                DisColl.enabled = false;
            } else
            {
                anim.SetBool("crouching", false);
                DisColl.enabled = true;
            }
        }
    }
  • Lesson21 场景切换SceneManager
  • 1.回到起点
    添加一个deadobject
    添加deadLine Tag
    重置游戏
using UnityEngine.SceneManagement;
//延时执行
Invoke("Restart", 2f);
//重新加载场景
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
//关闭音源
GetComponent().enabled = false;

2.跳转第二场景
复制场景
command +D
index
file -> build Setting
加载下一个场景

SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
  • Lesson22 光源光效
    -素材的Diffuse材质
    -法线贴图Normal map简介
    -电光源,方向光源
    有更好的解决方法,以后学到了再补充

  • Lesson23 视觉差Parallex
    代码如下

public class Parallex : MonoBehaviour
{
    public Transform cam;
    public float moveRate;
    private float startPointX, startPointY;
    public bool lockY;

    void Start()
    {
        startPointX = transform.position.x;
        startPointY = transform.position.y;
    }

    void Update()
    {
        if (lockY)
        {
            transform.position = new Vector2(startPointX + cam.position.x * moveRate, transform.position.y);
        }
        else
        {
            transform.position = new Vector2(startPointX + cam.position.x * moveRate, startPointY + cam.position.y * moveRate);
        }
    }
}

界面上设置moveRate调节背景移动速度
lockY锁Y轴

  • Lesson25 主菜单制作
    1.新建Scene作为主菜单
    2.添加panel作为背景,添加渐变动画
    3.添加开始结束按钮,在on click()中选择函数

  • Lesson26 暂停菜单
    1.暂停菜单
    游戏暂停
    Time.timeScale = 0f;
    Time.timeScale = 1f;
    2.声音调整
    创建 Audio Mixer
    将 Audio Mixer添加到 audio source output
    Audio Mixer -> expose Volume to script
    右上角修改变量名
    将修改事件绑定到slider
    修改事件 将slider值设置到AudioMixer的变量中

  • Lesson27 在移动设备上运行游戏
    平台插件安装失败问题:
    可以再 unityhub 安装-> 对应版本右上角小点中安装插件
    问题描述
    https://stackoverflow.com/questions/57633972/unity-ios-support-installation-failed
    build setting 选择对应平台,switchplatform
    下载joystick
    edit->project setting -> Device 选择设备
    手机下载 unity remote 5
    启动后可能要等待一会儿手机才能显示画面
    修改移动,跳跃,下蹲代码
    joystick.Horizontal
    joystick.Vertical
    通过判断 joystick.enabled 和 原有逻辑做或操作 即可兼容原来键盘的代码,
    如跳跃的判断改为

(Input.GetButtonDown("Jump") || (joystick.enabled && joystick.Vertical > 0.5f)) && coll.IsTouchingLayers(grouder)
  • Lesson28 移动跳跃手感优化、二段跳、单向平台
    手感优化二段跳这些建议直接看视频:2D横版移动跳跃完美手感(终极版/可多段跳)必看!
    单向平台:Platform Effector 2D即可解决

  • Lesson29 音效管理SoundManager

private AudioClip jumpAudio, hurtAudio, cherryAudio, gemAudio, deadAudio;

通过代码播放特定音效片段:

public void JumpAudio()
    {
        audioSource.clip = jumpAudio;
        audioSource.Play();
    }

重点:

public static SoundManager instance;    // 静态类
SoundManager.instance.JumpAudio();	//直接调用跳跃音效播放函数
  • Lesson30 导出游戏Bulid
    bulid setting导出游戏
    player setting设置导出游戏各种参数

目前存在问题:

  1. UI层如何自适应屏幕,分辨率增大而UI大小不变
  2. 实现爬梯子功能
  3. ……

你可能感兴趣的:(游戏,游戏开发,unity,c#)