43746人加入学习
(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();

}

 

 

 

 

 

 

 

 

[展开全文]

通过List<>存储小鸟和猪

[HideInspector]在unity的面板上隐藏

 

单例

 

 

[展开全文]

[hideinspector]

public 

虽然是共有的,但是面板里面是隐藏的

[展开全文]

1.列表 存储多个游戏物体,动态存储

2.Inovke()调用方法

3.remove()移除方法

游戏逻辑 gameManager

1.初始化小鸟状态:激活第一只小鸟,其他小鸟禁用

2.下一只小鸟状态激活:移除上一只小鸟,激活下一只小鸟

3.判定场景中猪的数量:猪的数量决定小鸟的激活

[展开全文]

游戏胜利判定。

hideininspector  

飞出去之后,5秒判断一下。

猪和木块可以用同一个脚本,

gamemanager    

管理小鸟,

管理猪,

初始化,第一只小鸟, 先从现象入手,然后写代码,  

init( 遍历鸟集合,  第一只小鸟,bird脚本和sp打开,其他的关上   );

 

鸟飞的时候,   gamemanager 单利,

5秒后调用 next 

鸟,next();  Gamemanager.instance.birds.remove(this);销毁自身,  实例化爆特效,

 

gamemanager

nextbird()

{

观察猪的数量,

观察鸟的数量。

}

 

猪和木块进行区分。是猪的化,进行移除。

[展开全文]

Start()将在MonoBehavior创建后在该帧Update()第一次执行前被调用;

Start()函数只在脚本实例被启用时才会执行;

Start函数总是在Awake函数之后执行。

如果把Initialized()放在Awake中,

MonoBehavior还没有创建,Initialized()无法处理到birds和pigs,

不会生效,3只鸟依然团在一起

放在Start中执行,一切正常。

 

 

一般开发中都是在Awake函数中获取游戏对象或者脚本实例的信息,然后在Start函数中进行一些获取之后的初始化设置。

[展开全文]

弹簧的应用 不是很懂  为什么设置2下 需验证弹簧的用发    

 

[展开全文]

GameManger

获取小鸟、猪   List<Bird> List<Pig>

 

初始化小鸟  Initialized()

激活第一只小鸟  禁用其他小鸟

 

 

 

[展开全文]

游戏逻辑的判定

场景中小鸟剩余的个数大于猪的数量我们就赢了

复制 bird 为三只

设置GameManager管理我们的小鸟

新建空物体作为 GameManager

public List<Bird> birds;

public List<Pig> pigs;

现在确定逻辑,当我们第一支小鸟还没有飞的时候,后面的小鸟的 Spring Joint 2D 和 Bird 组件要禁用

 

 

[展开全文]

public class GameManager

public List<Bired> birds;

publicList<Pig> pig;

public static GameManager _instance;

 

public void Awake()

{

 _instance=this;

}

private void Initialized()

{

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

{

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

{

birds[i].enabled=true;

birds[i].sp.enabled=true;

}

else

{

birds[i].enabled=false;

birds[i].sp.enabled=false;

}

}

[展开全文]

_instance (单例模式)

学习面向对象程序设计的朋友应该知道,我们大多数情况下通过 new 操作来实例化对象的。对于一些仅需要一次初始化的对象来说,频繁的new操作无疑会过多浪费内存空间。基于此,单例模式便应运而生了。所谓单例,即"一次初始化,多次操作"。

[展开全文]

老师我的第二个和第三个鸟不会上弹弓 他们只会原地爆炸。。。   

感觉上是弹簧组件没有被使用,我照着资源对照了一遍也还是没有发现问题

[展开全文]

hideinspector 可以让公有变量在某个地方看不见

[展开全文]

授课教师

SIKI学院老师

课程特色

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