其他分享
首页 > 其他分享> > 愤怒的小鸟(练习版)

愤怒的小鸟(练习版)

作者:互联网

一、前期准备

1、前期需要搭建一个场景

    (1)小鸟需要添加“Rigidbody 2D”组件、“Spring Joint 2D”组件、“Circle Collider 2D”组件;

    (2)弹弓是分为两部分的,左杈和右杈,注意小鸟和两个弹弓杈的渲染顺序,使小鸟可以在两个杈之间,右杈添加一个“Rigidbody 2D”组件;

    (3)猪头添加“Rigidbody 2D”组件、“Circle Collider 2D”组件;多复制几个猪头,并摞在一起;

    (4)桌子添加“Rigidbody 2D”组件、“polygon collider 2D”组件;

    (5)在地面位置添加一个2D方框,添加“Box Collider 2D”组件,透明度调整为0,当作一个地板;

    (6)创建一个空物体(trans)放在弹弓的分杈中间位置,当作小鸟的原始位置;

2、各游戏物体的组件设置

(1)小鸟:                                                                                                    

(2)猪头

 二、脚本编译

1、C#脚本编译

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

public class TragBirdTest2 : MonoBehaviour {

  
    Touch oldtouch1,newtouch1;
   

    //需求二:中心点
    [SerializeField]
    Transform center;
    //最大距离
    float MaxDistance = 3.0f;

    //需求三:
    private SpringJoint2D springJoint2d;
    private Rigidbody2D rig2d;
    private float releaseTime = 0.1f;//等待的时间

    // Use this for initialization
    void Start()
    {
        springJoint2d = GetComponent<SpringJoint2D>();
        rig2d = GetComponent<Rigidbody2D>();

        springJoint2d.enabled = false;//开始时小鸟的弹簧组件不能使用,防止开始弹簧组件起作用,小鸟一直被弹起
        rig2d.isKinematic = true; //开始小鸟的2D刚体组件设置为动力学模式【不受重力等影响】,开始弹簧不起作用,所以使其为动力学模式【Kinematic】,不受重力影响。
    }

    
    //协程功能:可用于设置等待时间
    private IEnumerator Release()
    {
        yield return new WaitForSeconds(releaseTime); //releaseTime为自定义的具体等待时间
        //以下是等待时间过后要执行的行为                                              
        springJoint2d.enabled = false;  //等待时间过后,禁用弹簧组件,使小鸟可以飞出去
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.touchCount < 1)
        {
            return;
        }
        else {
            Touch touch1 = Input.GetTouch(0);  //不断地获取触摸点0

            if (touch1.phase == TouchPhase.Began) {  //如果触摸点状态为刚开始触摸(未移动)             
                springJoint2d.enabled = true;  //当鼠标点击后,弹性组件起作用
                rig2d.simulated = true;    //2D刚体组件能够与仿真模拟进行交互
                oldtouch1.position = touch1.position;  //将触摸点位置传递给oldtouch1

            } else if (touch1.phase == TouchPhase.Moved||touch1.phase == TouchPhase.Stationary) {  //触摸点移动或者未移动但是触摸屏幕

                newtouch1.position = touch1.position;
 
                float distance = Vector2.Distance(newtouch1.position,oldtouch1.position);   //确定旧触摸点和新触摸点之间的距离
                Vector3 direction1 = (newtouch1.position - oldtouch1.position).normalized*distance;  //确定触摸点移动的方向和距离
                // (newtouch1.position - oldtouch1.position).normalized 是用来确定触摸点移动地方向
                // *distance 是确定移动方向之后再加上移动距离
                transform.position = center.position + direction1;  //小鸟地出发位置加上移动的方向和距离,就可以确定小鸟的目标位置

                //如果大于最大距离
                if (Vector3.Distance(transform.position,
                    center.position) > MaxDistance) {
                    Vector3 direction2 = (newtouch1.position - oldtouch1.position).normalized * MaxDistance;
                    transform.position = center.position + direction2;  //如果移动的距离大于“最大距离”,就只能移动“最大距离” 
                }
            } else if (touch1.phase==TouchPhase.Ended) {  //触摸点停止移动,并离开屏幕

                rig2d.isKinematic = false;//受重力影响

                StartCoroutine(Release());//开启协程
          
            }

        }
   
        }    
}

2、将编译好的C#脚本挂载到小鸟身上,作为其组件;

三、运行说明

1、将项目打包成apk文件,发布到Android平台后可正常运行

2、基本实现了滑动屏幕时可以拖动小鸟进行移动,释放触摸屏幕时小鸟可以飞出去;

3、可以通过滑动屏幕来调节小鸟飞行的角度,可以砸中猪头

四、运行情况截图

五、问题

1、视觉上没有设置弹绳

2、猪头添加了圆形碰撞器后无法像图片那样摞在一起,会自动滑落,图中的效果是在最下面一排的两边设置了两个小型挡板,透明度调为0,才能防止猪头滑落;

3、等等;

六、求教

欢迎可以帮忙解决问题2的大佬在下面留言,给出可以让猪头直接摞在一起的方法,谢谢了;

 

标签:2D,触摸,练习,小鸟,组件,position,愤怒,oldtouch1
来源: https://www.cnblogs.com/duoyaduoa/p/12957263.html