总之学到哪更到哪 ,自己用的笔记所以写得对别人来说会很混乱吧
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
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 参数同样可以调整跳跃力度
public Animator anim;
anim.SetFloat("running", Mathf.Abs(facedirection));
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
点击录制按钮,设置不同帧的样式。
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;
}
}
}
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(); //直接调用跳跃音效播放函数
目前存在问题: