撰写了文章 发布于 2017-08-23 21:53:14
[Unity2D] 横版2D游戏开发实例四
实例1 https://cowlevel.net/article/1904395
实例2 https://cowlevel.net/article/1904819
实例3 https://cowlevel.net/article/1905797
继上一节完成了人物吃金币以及顶砖块的部分,这一部分我们将引入敌人→小毛球,完成敌人的触发环节,实现之后,下面一章就是最终章啦!
敌人添加
人物的构成部分依旧与之前没有差别,通过空物件下挂载Sprite构成。注意添加Collider,并新增静态的动画。
为了实现毛球的弹跳效果,New Material→HairBallMaterial,Friction→0,Bounciness→0.6。添加材质到Collider上。
新增UnityChan受伤动画Damage
注意动画图层新建DamageLayer,并将该图层Weight设置为1,权重优先表示优先处理该受伤动画逻辑。新增Dummy即Emptey State,并关联到Damage。其中Dummy→Damage取消过渡,而Damage→Dummy则保留1秒左右的ExitTime。
新增Parameters,Damage,类型为Trigger,并在Dummy→Damage中添加对应Condition
挂载人物及小球对应脚本
分别针对小球和人物分别添加脚本HairBall及MoveController
HairBall
float force=500f;//小球碰触到人后对碰撞体施加的力
float speed=2f;//小球自身移动速度
bool attack=false;
void OnCollisionEnter2D(Collision2D col){
if(col.gameObject.tag=="Player"&&col.contacts[0].normal==Vector2.down){//当跳至敌人上方时碰触,则自毁
col.gameObject.SendMessage("ScorePlus",200);
Destroy(gameObject);
}
if(col.gameObject.tag=="Player"&&col.contacts[0].normal==Vector2.right||ontacts[0].normal==Vector2.left){//碰到怪物左侧或右侧则向相反位置后退并进入受伤状态
col.rigidbody.AddForce(-col.contact[0].normal*force);
attack=true;
Invoke("ContinueMove",1.2f);
col.gameObject.SendMessage("OnDamage");
}
}
void ContinueMove(){
attack=false;
}
void Update(){//默认移动状态
if(!attack){
transform.Translate(Vector3.left*speed*Time.deltaTime);
}
}
MoveController
bool damage=false;
void OnDamge(){
if(damage){return;}
damage=true;
animator.SetTrigger("Damage");
}
public void EndDamage(){//Damage动画末帧添加该方法用以结束受伤状态
damage=false;
}
void FixedUpdate(){
if(!damage){//受伤时无法操作
Move();
Jump();
}
}
目录