43102人加入学习
(204人评价)
【旧版】Unity初级案例 - 愤怒的小鸟

制作完成于 2018-1-22 本教程基于 Unity 2017.2开发

价格 免费

13-游戏逻辑的判定,实现多只小鸟的飞出

胜利的判定: 场景中小鸟个数大于猪的个数

 

复制成3只小鸟

 

新建【空物体】,命名:GameManager,位置归零

新建脚本,命名:GameManager

(让小鸟禁飞:Springjoint失活)

 

//获取到场景中3只小鸟:通过list集合

public List<Bird> birds;

//获取到猪的集合

public List<Pig> pig;

 

//初始化小鸟

private void Initialized()

{

  //遍历集合

for(int i=0;i<birds.Count;i++)

{

if(i==0)//第一只小鸟

{

birds[i].enabled=true;

【注意:在Bird脚本中写一个:[HideInspector]

public SpringJoint2D sp】

birds[i].sp.enabled=true;

}

else

}

birds[i].enabled=false; 

birds[i].sp.enabled=false;

}

给GameManager赋值

 

飞出去对小鸟进行删除操作,在GameManager脚本中

public static GameManager _instance;

private void Awake()

{

_instance=this;

}

  

飞出去对小鸟进行删除操作,在Bird脚本中,新建方法Next

 

 

 

//下一只小鸟的飞出

 

void Next()

{

GameManager._instance.birds.Remove(this);

Destroy(gameObject);

Instantiate(boom,transform.position,Quaternion.identity);

}

 

void Fly()

{

 

}

 

 

在GameManager脚本中,新建方法NextBird()

//判断游戏逻辑

public void NextBird()

{

if(pig.Count>0)

{

if(birds.Count>0)

{

//下一只飞

  Initialized();

}else

{

//赢了

}

}else

{

//赢了

}

 

}

 

在Bird脚本中

void Next()

{

GameManager._instance.NextBird();

}

 

复制猪

Pig脚本中

public bool isPig=false;

void Dead()

{

if(isPig)

{

GameManager._instance.pig.Remove(this);

}

}

在GameManager脚本中,新建方法Start()

private void Start(){

Initialized();

}

 

 

 

 

 

 

 

 

[展开全文]

12-死亡、加分特效的制作

找到特效图片:171、160、136、128、116、107、96、88、71、34、31、16

新建文件夹:Animation

选中的图片拖上去:命名:boom

 

boom--loop time勾选掉

 

新建文件夹:Prefabs

 

给【boom】新建脚本:Boom

public void destroying()
    {

        Destroy(gameObject);
    }
}

 

选中boom--coomand+6--添加【事件】

 

打开pig脚本

 public GameObject boom;

 

新建方法Dead()

void Dead(){

Destroy(gameObject);

Instantiate(boom, transform.position, Quaternion.identity);//生成烟雾特效

}

需要把boom做成Prefabs,赋值给pig脚本

 

制作加分效果:MENU_ELEMENTS_1

命名:pigScore

猪:红色3000分

做成Prefabs

 

打开pig脚本

 public GameObject score;

void Dead(){

Destroy(gameObject);

Instantiate(boom, transform.position, Quaternion.identity);//生成烟雾特效

GameObject go = Instantiate(score, transform.position + new Vector3(0,0.5f,0), Quaternion.identity);

 Destroy(go, 1.5f);//1.5秒以后销毁

}

 

 

 

 

 

 

 

 

 

 

 

[展开全文]

11-弹弓划线操作

左边树枝创建【空物体:leftPos】移动到橡皮筋处

 

给左右树枝添加【Line Renderer】

Materials--Element 0--Sprites-Def..--color:吸取皮带上颜色

width:0.2

 

打开Bird脚本

获取到2个组件

 public LineRenderer right;

 public LineRenderer left;

public Transform leftPos;

 

画线函数 line()

void Line(){

        right.SetPosition(0, rightPos.position);
        right.SetPosition(1, transform.position);

        left.SetPosition(0, leftPos.position);
        left.SetPosition(1, transform.position);

}

 

放在

transform.position = pos + rightPos.position;

            }后

Line();

 

最后:给脚本赋值,子物体拿过去

 

 

 

 

 

 

[展开全文]

11.line renderer组件;line renderer.set position;

[展开全文]

9.DynamicKinematic;Spring Joint 2D 禁用;

[展开全文]

任务10-猪的受伤

搭建场景

新建【空物体】:env,空物体归零

找图片:THEME_01_THEME_1,修改【Sprite Mode】为Multiple -- 裁一下 --图片拖上去--添加【碰撞盒Box Cllider 2D】,碰撞盒上面不要填满

主题拖到env下边--大量复制【command+D】

 

给小鸟增加阻力

bird--Rigibody 2D--Angular Drag:2

 

加入  【猪:pig】  编码:103

更改猪的图层为:player

给猪加一个【Rigibody 2D Angular Drag:2 】、【Circle Collider 2D     radius:0.35】

 

猪的死亡和受伤

添加脚本:Pig

2个碰撞检测方法

     OnCollisionEnter2D(Collision2D collision)//碰撞检测

 OnTriggerEnter2D(Collision2D collision)//触发检测

定义2个变量

    public float maxSpeed = 10;//最大速度

     public float minSpeed = 5; //最小速度

 

判断一下

引出概念:相对速度

 if (collision.relativeVelocity.magnitude > maxSpeed)//直接死亡
        {

            Dead();

        } else if (collision.relativeVelocity.magnitude > minSpeed && collision.relativeVelocity.magnitude < maxSpeed) {
            render.sprite = hurt;//更换图片:104
            
        

获取组件

 private SpriteRenderer render;

 

 

在Awake下进行赋值

 private void Awake()
    {
        render = GetComponent<SpriteRenderer>();
    }

 

获取组件

 

 

最大速度改为:8

最小速度改为:4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[展开全文]

09-小鸟的飞出

其实就是使【Spring Joint 2D 组件】失活

 

1.获取到组件

        public SpringJoint2D sp;

在Awake()下进行获取

       private void Awake()
    {
        sp = GetComponent<SpringJoint2D>();
    }

 

2.鼠标抬起,失活

 private void OnMouseUp() //鼠标抬起
    {
            isClick = false;      
           sp.enabled = false;

        }

    }

 

3.小鸟飞出速度过快

  小鸟【Rigidbody 2D】中的【Body Type】参数改成【kinematic】

   3-1:在脚本里更改

  protected Rigidbody2D rg;

       private void Awake()
    {
        sp = GetComponent<SpringJoint2D>();

         rg = GetComponent<Rigidbody2D>();
    }

 

   3-2:鼠标按下

        private void OnMouseDown()//鼠标按下
    {
            isClick = true;

            rg.isKinematic = true;

            //Kinematic :运动
    }

 

鼠标抬起

private void OnMouseUp() //鼠标抬起
    {
      
            isClick = false;
            rg.isKinematic = false; 

           sp.enabled = false;    //粘贴到Fly()中      

    }  
 

4.小鸟飞出后的操作

 void Fly()
    {
 
        sp.enabled = false;
   
    }

4-1:让电脑零点1、2秒时间计算

需要用到【Invoke函数】

Invoke("方法名",多长时间调用)

 

 private void OnMouseUp() //鼠标抬起
    {

            isClick = false;
            rg.isKinematic = false;
            Invoke("Fly", 0.1f);     

    }
 

 

 

 

 

 

[展开全文]

猪的受伤

using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class lostHP : MonoBehaviour
{
    public int miaosha_sudu_zuidazhi = 10;
    public int banxue_sudu_zuidazhi = 5;
    public SpriteRenderer pig;
    public Sprite banxue_tupian;
    private void OnCollisionEnter2D(Collision2D collision)
    {
        Debug.Log(collision.relativeVelocity.magnitude);
        if(collision.relativeVelocity.magnitude > miaosha_sudu_zuidazhi)
        {
            Destroy(gameObject);

        }
        else if (collision.relativeVelocity.magnitude < miaosha_sudu_zuidazhi && collision.relativeVelocity.magnitude > banxue_sudu_zuidazhi)

        {
            pig.sprite = banxue_tupian;
        }
    }
}

[展开全文]

本课代码

using UnityEngine;

public class bird : MonoBehaviour
{
    public Transform rightPos;
    public Transform leftPos;
    bool isClick = false;
    public float maxDis = 3;
    SpringJoint2D sp;
    Rigidbody2D rb;
    public LineRenderer dangonghuaxian_you;
    public LineRenderer dangonghuaxian_zuo;
    // Start is called before the first frame update
    private void OnMouseDown()//鼠标按下时
    {
        isClick = true;
        sp.enabled = true;
        rb.isKinematic = true;
    }
    private void OnMouseUp()//鼠标松开时 
    {
        isClick = false;
        rb.isKinematic = false;
        Invoke("Fly", 0.1f);
    }
    private void Awake()
    {
        sp = GetComponent<SpringJoint2D>();
        rb = GetComponent<Rigidbody2D>();
        
    }

    // Update is called once per frame
    void Update()
    {
        if (isClick)
        {
            transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            transform.position += new Vector3(0, 0, -Camera.main.transform.position.z);
            if (Vector3.Distance(transform.position, rightPos.position) > maxDis)
            {
                Vector3 pos = (transform.position - rightPos.position).normalized;
                pos *= maxDis;
                transform.position = pos + rightPos.position;
            }
            dangonghuaxian_zuo.SetPosition(0,transform.position);   
            dangonghuaxian_zuo.SetPosition(1,leftPos.position);
            dangonghuaxian_you.SetPosition(0, transform.position);
            dangonghuaxian_you.SetPosition(1, rightPos.position);
        }
    }
    void Fly()
    {
        sp.enabled = false;
    }
}
 

[展开全文]

/summon warden循声守卫

/summon minecraft:iron_golem铁傀儡

[展开全文]

授课教师

SIKI学院老师

课程特色

图文(1)
下载资料(1)
视频(44)