愤怒的小鸟

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界面不会触发

posted @ 2025-03-15 21:36  无法言语的寂灭之形  阅读(50)  评论(0)    收藏  举报