Day 2025/2/20
愤怒的小鸟
剪切精灵图-改sprite mode为mutiple
在sprite editor中slice
设置弹弓与鸟的层级关系layer-player
鸟加springjoint组件-distance-0.3-autodistance关闭
弹弓组件的一些基本属性:
Distance:两点之间的固定距离(设定完有剩余的距离就是可拉伸的长度)
Frequency:弹力值,这里设置为2
先将鸟的物理特性默认设置为dynamic!!
鸟添加circle colider,调整碰撞体积
弹弓加box组件-rigidbody-static(静止不动)
鼠标按下
transformposition = camera.main.screentoworldpoint(input.mouseposition)
(将鼠标坐标系转为世界坐标系)
Bug:鸟会消失不见
解决:鸟transformpos = (0,0,10)
或者transformpos = new vector3(0,0,camera.main.transform.position.z)
鼠标按下方法onmousedown()
控制isclick变量
Day 2025/2/21
设定弹弓可拉的最大距离
Vector3.Distance(pointA, pointB);
获取A和B之间的距离
if (Vector3.Distance(transform.position,rightPos.position)>maxDis)
{
Vector3 pos = (transform.position - rightPos.position).normalized;
Debug.Log(pos);
pos = maxDis * pos;
transform.position = pos+rightPos.position;
}
关于这一段的说明:很明显maxdis就是最大可移动距离,就是与弹弓的偏移量
逻辑就是当鸟-弹弓的距离大于maxdis
maxdis还要转换成向量
最后就是vector3(maxdis)+vector3(弹弓)
小鸟的飞出
直接引入spring joint秋千组件,鼠标弹起时禁用就行
Sp.enable = false
Bug:小鸟飞出力度过大
解决:在拖拽时取消物理特性
引入rigid组件,在鼠标按下时
Rg.iskinematic = true
抬起时为false
Bug:鸟弹出时没有力度
解决:鼠标抬起时,再延时取消秋千组件
Invoke(“fly”,0.1f)
猪的受伤
场景-精灵图-裁剪
给地面碰撞体积-碰撞体积比原图小一点-草地没有碰撞
地面做长一点-小鸟会飞很远
小鸟的阻力angular drag调为2
新建猪-调整猪的圆形碰撞体积-阻力一样为2
猪的受伤判定:被碰撞物体速度大于maxspeed时直接死亡,在minspeed和maxspeed中受伤
If(collision.relativevelocity.magnitude > maxspeed){ die }
皮筋的绘制
使用linerenderer
脚本中的运用
Right.setposition(0,rightpos.position)
Right.setposition(1,transform.position)
物体、死亡、加分的特效
精灵图裁剪
在动画特效中ctrl+6
Animation编辑器中绑定事件完成动画后执行destroy事件
猪死亡后生成die组件
加分:猪死后在头上方生成分数,1.5s后消失
Day 2025/2/22
多只小鸟的轮换
添加gamemanager组件,引入3只小鸟
Public list<bird> birds
Public list<pig>
禁用所有小鸟的运动组件
遍历选中第一个小鸟启用组件
小鸟的脚本中
[HideInInspector]
Private rigibody2d rd
就可以在其他脚本中访问该变量
然后将gamemanager设为单例模式,飞出的小鸟在数组中删掉
等待飞出的小鸟5s后再删除
死亡的小鸟也要生成boom特效
游戏逻辑nextbird(){
If猪大于0,并且小鸟>0切换小鸟
没鸟了,输了
}else{ 赢 }
在飞出5s后调用next bird
猪的脚本与木头公用,猪死亡时判断是否是猪
Day 2025/2/23
解决皮筋残留,小鸟弹出力度过大问题
弹弓放鸟位置是固定的,在游戏开始时就将第一只小鸟的位置保存
然后每次鸟死亡切换鸟时将位置给鸟数组的第一个
皮筋残留:鼠标抬起禁用,要划线时启用
小鸟拖尾效果
小鸟添加一个空组物体
物体包含weapontrail和meshrenderer
Meshrenderer材质为weapontrail
在bird下新建trail脚本
飞行是开始拖尾,碰到物体结束拖尾
加入木头,场景层级问题
Day 2025/2/24
游戏失败和胜利的UI界面
屏幕自适应:canvasScaler-scale with screen
游戏失败动画-添加颜色渐变
失败胜利场景-取消looptime重复播放
胜利画面播放完成后显示星星
放入星星,火花特效
Canvasrenderer改成camera
新建UIcamera-clear flags-depth only
Projection-orthog
Audiolistener -删除
让星星一颗一颗显示
首先写显示星星的函数
For inti = 0 i<birds.cout+1;i++
Star[i].setactive true
这边cout+1是因为星星最少是要显示1颗的
星星延时显示
用协程
IEnumerator show(){}
public void showStars(){
StartCoroutine("show");
}
IEnumerator show(){
for (int i = 0; i < birds.Count+1; i++)
{
yield return new WaitForSeconds(0.2f);
stars[i].SetActive(true);
}
}
固定写法
Day 2025/2/25
Bug:鸟飞后还可以控制鸟
解决:鼠标抬起时canmove = false,死亡后canmove = true
暂停动画
渐入动画:anchiored position
镜头跟随
使用vector3.lerp插值
三个参数:位置1,位置2,平滑值
Vector3.lerp(1,2,3)
使用平滑值可以使第一个小鸟死亡时切换回第二个小鸟有平滑移动,不然直接镜头转回来回很突兀
数值越大,镜头移动越快
posX= transform.position.x;
Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position,new Vector3(Mathf.Clamp(posX,0,15),Camera.main.transform.position.y,Camera.main.transform.position.z),smooth*Time.deltaTime );
播放音频
添加黄色小鸟
删除新建yellowBird脚本
public class yellowBird : bird
{
public override void showSkill(){
// base.showSkill();
rd.velocity *=2;
}
}
重写方法
Bird:
public virtual void showSkill(){
Flying = false
}
Protected rigid2D rg;
保护属性
跟public和private不同的是,外部无法调用,子类可以调用
绿色小鸟(翻转)
public override void showSkill()
{
Vector3 speed = rd.velocity;
speed.x *= -1;
rd.velocity = speed;
}
黑色小鸟(爆炸)
添加碰撞盒circlecollider2D trigger =true 调大半径
当碰撞盒接触到物体添加到数组内,点击爆炸后调用数组内物体的死亡函数
爆炸后速度为0,爆炸特效,小鸟消失
Vector3.zero renderer.sprite = false rigidbody2d = false
Day 2025/2/26
星星数组越界问题
IEnumerator show(){
for (int i = 0; i < birds.Count+1; i++)
{
if (i>=stars.Length)
{
break;
}
yield return new WaitForSeconds(0.2f);
stars[i].SetActive(true);
}
}
地图选择UI
地图选择的逻辑编写
每个地图三个变量
需要星星数量public
锁
已获得星星gameobject
关卡选择
关卡选择和地图选择是一个场景
每一关都有一个levelSelect脚本,默认第一关是可选的
Transform.parent.getchild
地图选择和关卡选择
每个地图对应不同的关卡组
点击后所有地图map隐藏,对应关卡组显示
存储星星数据
点击关卡时 新建nowlevel+关卡数字 键值对
关卡通关时 获取nowlevel 关卡+星星数 键值对
关卡选择,场景转跳
将game场景放入resources文件夹
相机camera新建脚本load,进入到game场景中就
Resources.load(playprefabs.nowlevel)
关卡界面显示星星
选择的时候原本有3个星星隐藏了
进入关卡选择时脚本会遍历此关卡有多少星星
关卡通关时 获取nowlevel 关卡+星星数 键值对
Level1 3
星星显示个数bug:在通关保存星星时做判断,小于之前的数量就不做存储
--
星星总数
每次通关时执行
做一个总关数的遍历,把所有关的星星相加
然后保存
关卡之间的显示
每一个关卡判断前一关卡的星星数是否大于1,大于1则显示可选择
Day 2025/2/28
关于关卡-地图二关卡的命名是接着地图一的
比如地图一到10关地图二就要从11关算起
Snap setting
在edit中,是一个比较方便的复制物体无缝对齐的工具
地图星星显示
每个地图有起始关卡和结束关卡
Public int startNum
Public int endNum
比如地图二的起始关卡是10关-20关
然后遍历这几关的星星数量
异步加载场景(loading)
Scene.loadAsync
修复bug
未上弹弓的鸟可以点击
将未上弓的小鸟flying设置为true
游戏暂停依旧可以操作鸟
引入isPause属性
鸟飞的时候点暂停会触发技能:
If(evensystem.current.ispointerovergameobject) //如果点击了UI界面不会触发