添加敌人
-
添加一个敌人
-
加上Collider 2D用OnCollisionEnter2D来给予伤害,这些都比较简单不仔细说了。
private void OnCollisionEnter2D(Collision2D collision)
{
Player p = Helper.GetPlayerByCollision2D(collision);
if (p == null) return;
p.HealthChange(-damege);
}
- 加一个感叹号标志,如果Player进入攻击范围后就在怪的头上生成一个,并且自带动画。
简单动画
-
在Assets下创建Animation文件夹。并在内部创建一个Animator Controller,并拖到对象上。
-
此时会自动产生一个Animator组件
-
按Ctrl+6打开Animation编辑器,再在场景中选中要添加动画的对象(感叹号)。再Create一个动画。
-
显示需要关键帧的帧数。这个Sample Rate表示一秒钟需要多少帧,而我们可以编辑的帧数与之无关。例如Sample=10,而我编辑前面5帧,相当于是一秒钟播放两遍。
-
通过Add Property选择要使用的效果。
-
可以搞出012三帧,第0帧Scale全是0,第2帧Scale为预期大小(自己调试),第1帧比第2帧大些。一个先变大后缩回去的动画就做好了。
-
回到Animator,发现此时以及自动创建了一个对应的状态机(可以自己右键创建,并将motion改为刚才搞好的动画。)
-
由于放完动画后结束不能循环,所以设置动画的Loop Time
动画结束后销毁对象
-
我们希望感叹号的动画播放后销毁这个感叹号。
-
我们可以利用StateMachine的behavior来实现。
-
Animator添加一个bool参数isEnd
-
让刚才的状态机指向新的状态机
-
对刚才的状态机添加behavior
-
在OnStateExit里面(状态机转到其他状态机时触发)通过SetBool修改isEnd的值。
-
感叹号的脚本里用update检测isEnd是否为真,如果是就销毁
-
但是这个办法需要额外挂载脚本且设置的比较麻烦,如果知道了动画的时间可以直接在创建后Destory(obj,time)来倒计时销毁。
敌人添加感叹号
检测和Player的距离,如果小于攻击范围就用Instantiate生成一个感叹号(需要测量相对位置)。
public GameObject exclamation;
void Update()
{
if (!wantAttack)
{
float dis = Helper.GetDistance(Player.GetComponent<Transform>().position, transform.position);
// Debug.Log(dis);
if (dis <= attackRange)
{
wantAttack = true;
Vector2 pos = (Vector2)transform.position + new Vector2(0.5f, 0.55f);
GameObject exc = Instantiate(exclamation, pos, Quaternion.identity);
exc.transform.localScale = new Vector3(2.7f, 2.2f, 0.7f);
}
}
}