愤怒的小鸟

开发工具

在这里插入图片描述

搭建场景

小鸟的拖拽

2.4小鸟的拖拽

给小鸟添加一个圆型碰撞器,在小鸟的属性面板中输入点击add component,选择circle collider 2D,通过调节radius属性的值来调节圆形的大小。
给小鸟添加一个C#脚本,命名为bird,代码如下:

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

public class bird : MonoBehaviour {
    private bool isClick = false;
    private void OnMouseDown()//当用户在GUIElement或者碰撞器中按下鼠标时系统会自动调用的函数
    {
        isClick = true;
    }
    private void OnMouseUp()//当用户在GUIElement或者碰撞器中抬起鼠标时系统会自动调用的函数
    {
        isClick = false;
    }
    private void Update()
    {
        if (isClick)//当鼠标一直按下时
        {
            //transform.position = Input.mousePosition;//将鼠标的位置赋值给当前物体的位置
            //使用上一行代码会存在一个问题,鼠标的位置和当前物体的位置不在同一个坐标系下,小鸟的位置是在世界坐标系下(例如在unity中默认的(0,0)点位置和鼠标所在(0,0)点的位置(鼠标的(0,0)点是在屏幕的左下角)不同)需要来统一坐标系
            transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);//将屏幕坐标转化为世界坐标
            //这里存在一个问题,拖拽小鸟时出现小鸟的z轴被强制赋值为-10,和相机的z轴保持一致,在3D视角下可以发现,当小鸟的z轴小于-10或者大于0则相机都无法拍摄到小鸟的位置,所以需要强制锁定小鸟拖拽后的z轴的值在-10到0之间
            //transform.position += new Vector3(0, 0, 6);//强制锁定小鸟的z轴值为-4(方法一)
            transform.position += new Vector3(0, 0, -Camera.main.transform.position.z);//将小鸟的z轴坐标加上主摄像机的z轴坐标的赋值来强制锁定小鸟的z轴为0(方法二)
        }
    }
}

限定小鸟的最大拖拽距离

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

public class bird : MonoBehaviour {
    private bool isClick = false;
    public Transform rightPos;//Transform包含了物体的位置,旋转等信息,这里用来申明一个物体rightPos   
    public float maxDis = 3;//设置小鸟拖拽的最大距离
    private void OnMouseDown()//当用户在GUIElement或者碰撞器中按下鼠标时系统会自动调用的函数
    {
        isClick = true;
    }
    private void OnMouseUp()//当用户在GUIElement或者碰撞器中抬起鼠标时系统会自动调用的函数
    {
        isClick = false;
    }
    private void Update()
    {
        if (isClick)//当鼠标一直按下时
        {
            //transform.position = Input.mousePosition;//将鼠标的位置赋值给当前物体的位置,transform理解为当前物体
            //使用上一行代码会存在一个问题,鼠标的位置和当前物体的位置不在同一个坐标系下,小鸟的位置是在世界坐标系下(例如在unity中默认的(0,0)点位置和鼠标所在(0,0)点的位置(鼠标的(0,0)点是在屏幕的左下角)不同)需要来统一坐标系
            transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);//将屏幕坐标转化为世界坐标
            
            //transform.position += new Vector3(0, 0, 6);//强制锁定小鸟的z轴值为-4(方法一),Vector3表示一个三维向量,包含位置,方向等信息
            transform.position += new Vector3(0, 0, -Camera.main.transform.position.z);//将小鸟的z轴坐标加上主摄像机的z轴坐标的赋值来强制锁定小鸟的z轴为0(方法二)
            if (Vector3.Distance(transform.position, rightPos.position) > maxDis)
            {
                Vector3 pos = (transform.position - rightPos.position).normalized;//单位化向量,normalized属性用来实现单位化向量
                pos *= maxDis;//得到最大长度向量
                transform.position = pos + rightPos.position;//小鸟的位置限制
            }
        }
    }
}

小鸟的飞出

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

public class bird : MonoBehaviour {
   private bool isClick = false;
   public Transform rightPos;//Transform包含了物体的位置,旋转等信息,这里用来申明一个物体rightPos   
   public float maxDis = 3;//设置小鸟拖拽的最大距离
   public SpringJoint2D sp;//定义一个SpringJoint2D类型的组件
   private Rigidbody2D rg;//定义一个组件
   //Awake()是在脚本对象实例化时被调用的,而Start()是在对象的第一帧时被调用的,而且是在Update()之前。
   private void Awake()
   {
       sp = GetComponent<SpringJoint2D>();//脚本将自动识别物体中的SpringJoint2D组件,并将其赋值给sp
       rg = GetComponent<Rigidbody2D>();//组件赋值
   }
   private void OnMouseDown()//当用户在GUIElement或者碰撞器中按下鼠标时系统会自动调用的函数
   {
       isClick = true;
       //
       rg.isKinematic = true;//表示开启运动学
   }
   private void OnMouseUp()//当用户在GUIElement或者碰撞器中抬起鼠标时系统会自动调用的函数
   {
       //该部分力学分析:当不更改任何条件时,小鸟在被拖拽起来后受到重力和弹簧的弹力两个力的作用,当受力达不到理想的效果的时候,小鸟就有可能达不到理想的平抛效果,这是可以采取一种方法来实现小鸟的平抛效果,首先
       isClick = false;
       rg.isKinematic = false;//表示关闭运动学
       Invoke("Fly", 0.1f);//使用Invoke函数来实现延时执行函数,前面表示执行的函数名称,后面的表示延时的时长
   }
   private void Update()
   {
       if (isClick)//当鼠标一直按下时
       {
           //transform.position = Input.mousePosition;//将鼠标的位置赋值给当前物体的位置,transform理解为当前物体
           //使用上一行代码会存在一个问题,鼠标的位置和当前物体的位置不在同一个坐标系下,小鸟的位置是在世界坐标系下(例如在unity中默认的(0,0)点位置和鼠标所在(0,0)点的位置(鼠标的(0,0)点是在屏幕的左下角)不同)需要来统一坐标系
           transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);//将屏幕坐标转化为世界坐标
           //这里存在一个问题,拖拽小鸟时出现小鸟的z轴被强制赋值为-10,和相机的z轴保持一致,在3D视角下可以发现,当小鸟的z轴小于-10或者大于0则相机都无法拍摄到小鸟的位置,所以需要强制锁定小鸟拖拽后的z轴的值在-10到0之间
           //transform.position += new Vector3(0, 0, 6);//强制锁定小鸟的z轴值为-4(方法一),Vector3表示一个三维向量,包含位置,方向等信息
           transform.position += new Vector3(0, 0, -Camera.main.transform.position.z);//将小鸟的z轴坐标加上主摄像机的z轴坐标的赋值来强制锁定小鸟的z轴为0(方法二)
           if (Vector3.Distance(transform.position, rightPos.position) > maxDis)//Vector3中有一个方法Distance用来计算两个向量的位移,这里用来计算小鸟和rightPos之间的位移
           {
               Vector3 pos = (transform.position - rightPos.position).normalized;//单位化向量,normalized属性用来实现单位化向量
               pos *= maxDis;//得到最大长度向量
               transform.position = pos + rightPos.position;//小鸟的位置限制
           }
       }
   }
   public void Fly()//设定一个函数Fly()用来关闭弹簧的功能
   {
       sp.enabled = false;//当鼠标弹起时,将弹簧的功能禁用,可实现小鸟飞出的功能
   }
}

预知后事如何,等待更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值