您现在的位置是:首页 >学无止境 >unity愤怒的小鸟学习制作(二)网站首页学无止境

unity愤怒的小鸟学习制作(二)

林一百二十八 2024-06-17 11:19:06
简介unity愤怒的小鸟学习制作(二)

终于又开始了啦啦啦,我有一个自己的相机了,真开心,诶嘿

视频链接和素材如下:视频


小鸟的飞出

想要让小鸟在拉开弹弓之后能飞出去,就必须让这个组件失活,如下

在这里插入图片描述

所以我们更改脚本内容,加入:

 private SpringJoint2D sp;
     private void Awake()
    {
        sp = GetComponent<SpringJoint2D>();
    }
     private void OnMouseUp()//当鼠标抬起就会调用该函数
    {
        isClick = false;
        sp.enabled = false;
    }

然后就可以看到小鸟飞出去的速度很大,需要修改。

可以通过小鸟是否加入动力学进行修改,这样速度就不会太大(讲真,没怎么听懂)
在这里插入图片描述

也就是,先修改成:
在这里插入图片描述

然后再将脚本修改成:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bird : MonoBehaviour
{
    //要实现当鼠标一直按下时,小鸟的位置跟随鼠标的位置
    private bool isClick = false;
    public Transform rightPos;
    public float maxDis = 3;//最大距离是3米
    
    private SpringJoint2D sp;
    private Rigidbody2D rg;
    private void Awake()
    {
        sp = GetComponent<SpringJoint2D>();
        rg = GetComponent<Rigidbody2D>();
    }

    private void OnMouseDown()//当鼠标按下就会调用该函数
    {
        isClick = true;
        rg.isKinematic = true;//开启动力学
    }
    private void OnMouseUp()//当鼠标抬起就会调用该函数
    {
        isClick = false;
        rg.isKinematic = false;
        Invoke("Fly", 0.1f);
    }

   
    private void Update()//刷新
    {
        if (isClick)//鼠标一直按下,进行位置的跟随
        {
            transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            //需要把小鸟的Z轴减去主摄像机的Z轴
            transform.position -= new Vector3(0, 0, Camera.main.transform.position.z);
            //保证z轴数值为0
            //transform.position += new Vector3(0,0,10);

            if (Vector3.Distance(transform.position, rightPos.position) > maxDis)//大于最大长度
            {
                Vector3 pos = (transform.position - rightPos.position).normalized;//单位化向量
                pos *= maxDis;//最大长度的向量
                transform.position = pos + rightPos.position;
            }
        }
    }

    //专门为了小鸟飞出写的函数
    void Fly()
    {
        
        sp.enabled = false;
    }
}




这样基本就可以了,但是如果需要微调的话,可以调节以下参数:

在这里插入图片描述
这里的Damping Radio就是阻尼系数,范围是0-1,系数越大,弹簧的弹力效果越不明显

小鸟和猪、木头的碰撞(死或者受伤)

因为小鸟飞出之后需要有一个平面来接住他,所以要新建一个空物体

也就是在Hierachy空白处右键点击,选择创建空物体
在这里插入图片描述
然后再将空物体归零

在这里插入图片描述
因为空物体要存放所有需要的环境之类的,所以重命名为env

接下来找到需要的主题,比如这个第一个主题,点击之后,在Spite Mode 这里,将Single改成Mutiple,然后点击下方的Apply
在这里插入图片描述

完成Apply之后点击Sprite Editor进行裁剪
在这里插入图片描述
虽然视频里面点击一下Trim就切割完成了,但是我没成功,就只好手动切割了,切割完成就点击Apply

在这里插入图片描述
然后将颜色较深的这个切割好的图片拖到上面

在这里插入图片描述
然后给图片添加一个碰撞盒
在这里插入图片描述

在这里插入图片描述
然后编辑碰撞盒
在这里插入图片描述

在这里插入图片描述
将盒子向下拉一点,再将这个图片放到env里面

在这里插入图片描述
在这里插入图片描述
然后不断复制粘贴拼接图片,在Scence里面放好小鸟的地面,如下:
在这里插入图片描述
尝试运行,发现小鸟飞的太快了,没有阻力

在这里插入图片描述
修改这个Angular Drag,因为这个值相当于空气阻力的一种,将其放大,测试,发现还可以

在这里插入图片描述
挑选一只猪,将其拖上去,然后摆放好位置

给这只猪加一个碰撞盒和一个Rigidbody2D

在这里插入图片描述

记得修改参数

在这里插入图片描述

现在开始给猪一个脚本,写关于他的碰撞死亡


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Pig : MonoBehaviour
{
    // Start is called before the first frame update
    
    public float maxSpeed = 10;
    public float minSpeed = 5;
    private SpriteRenderer render;
    public Sprite hurt;

    private void Awake()
    {
        render = GetComponent<SpriteRenderer>();
    }
    private void OnCollisionEnter2D(Collision2D collision)
    {
        //相对速度
        print(collision.relativeVelocity.magnitude);
        if (collision.relativeVelocity.magnitude > maxSpeed)//直接死亡
        {
            Destroy(render);
        }else if(collision.relativeVelocity.magnitude > minSpeed&& collision.relativeVelocity.magnitude < maxSpeed)
        {
            render.sprite = hurt;
        }
    }
}


然后再将hurt的对象变为小猪受伤的图片,104号

在这里插入图片描述
运行,感觉还不错

今日就到这里吧

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。