前言
是的,我回来了,鸽了一大段时间,抽空花两天设计了一些新东西。虽然最近被一堆师兄老师pua,导致徒增了不少焦虑。但是感觉时不时回来写一下这个谷歌小恐龙也起到了舒缓情绪的作用。而且突然有一个不错的思路。在之前我们设计的BOSS都是一大个的boss,来自泰拉瑞亚这款游戏。本来想着延续下去,去把泰拉瑞亚新三王的设计偷过来结果发现这玩意在wiki上面没有动画。导致我不得不想别的办法。于是,这一次的设计就参考了泰拉瑞亚里面的其他设计----入侵事件。
入侵事件
本次设计虽然也是把这个模块放在了BOSS这里,但是这个boss并非一个个体,而是一个入侵事件。我要参考的,是来自泰拉瑞亚困难模式的入侵事件--海盗入侵。
原本游戏中入侵事件就是一堆怪从东南西北发动袭击,然后会有一个大boss设计。考虑到很久没有设计过小怪,那么就用这个练练手吧!
话不多说,直接开始本次练习
固定方位袭击
固定方位袭击的敌人会从左右两边,以及天空袭击下来。这里我设计了三个敌人
鹦鹉,鲨鱼以及水母
由于鹦鹉的设计与本来就存在的翼龙很相似,因此直接使用其脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class flyMove : MonoBehaviour
{
[Header("Set in Inspector")]
public GameObject dino;//恐龙对象
public float speed;
public Vector3 dinoPos;
public Vector3 vel;
public Vector3 summonPos;
public int facing = 1;//生成在前面还是后面
private Rigidbody rig;//刚体对象
private bool isTrack;// Start is called before the first frame update
void Start()
{
dino = GameObject.Find("dino");
dinoPos = dino.transform.position;
float x = Random.Range(17, 31);//随机一个x轴坐标
summonPos = new Vector3(x, 10f, 0);
gameObject.transform.position = summonPos;
if (summonPos.x - dinoPos.x<=0)//生成在后面
{
facing = -1;
}
if (facing == -1) {//假设为后方
gameObject.transform.rotation = Quaternion.Euler(0, 180f, 0);
}//找到游戏中的恐龙对象
rig = GetComponent<Rigidbody>();//获取刚体
isTrack = false;
speed = 5f;
}// Update is called once per frame
void Update()
{
Vector3 pos =gameObject.transform.position;
if (pos.x <= 18 || pos.x >= 32)
{
Destroy(gameObject);
}//超出范围销毁
if (dino != null&&isTrack==false)//假如不存在恐龙对象
{
vel =dinoPos-gameObject.transform.position;//获取速度方向
vel.Normalize();
rig.velocity = vel*speed;
isTrack = true;
}
}
}
然后就是鲨鱼和水母,两者的设计思路基本一致,靠近主角然后发动突然袭击!
鲨鱼的袭击,是检测主角的瞬时位置,在靠近主角时,跃出水面:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class sharkMove : MonoBehaviour
{
[Header("设置")]
public GameObject dino;
public Vector3 dinoPos//属性主角坐标
{
get
{
return dino.transform.position;
}
set
{
value = dino.transform.position;
}
}
public Vector3 Pos//属性自身坐标
{
set
{
gameObject.transform.position = value;
}
get
{
return gameObject.transform.position;
}
}
public Vector3[] summonPos = new Vector3[]//初始位置生成
{
new Vector3(30f,3f,0),new Vector3(20f,3f,0)
};
private Rigidbody rig;
private Transform trs;
private Vector3 vel;
private bool isJump;
// Start is called before the first frame update
void Start()
{
dino = GameObject.Find("dino");//获取恐龙的实例化
rig = gameObject.GetComponent<Rigidbody>();//获取刚体实例化
trs = gameObject.GetComponent<Transform>();//获取transform实例化
int num = Random.Range(0, 2);
Pos = summonPos[num];//获取生成位置
if (num == 1)//根据生成我位置获取速度
{
rig.velocity = Vector3.right * 5f;
vel = rig.velocity;
}
else
{
rig.velocity = Vector3.left * 5f;
vel = rig.velocity;
}
isJump = false;
}
// Update is called once per frame
void Update()
{
if (Pos.x <= 18f || Pos.x >= 32f)
{
Destroy(gameObject);
}
if (Mathf.Abs(dinoPos.x - Pos.x) <= 3f&&isJump==false)
{
isJump = true;
rig.velocity = Vector3.zero;
rig.velocity = Vector3.up * 8f + vel;
}
}
}
可以发现,这次我使用了一个与众不同的变量定义----属性
一种C#中的特殊语法,用于传入变量时可以进行修饰以及特殊修改,是一种十分便捷的变量定义方式,好像java也有类似的语法。 属性这个以后还会经常使用,说实话,使用属性也可以让代码更加好看。
然后是水母,水母在出生时就检测主角位置,然后游到那个位置飞起来袭击主角。同时会改变贴图,起飞时贴图修改为放电的水母。以下为代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class jellyFinsh : MonoBehaviour
{
[Header("设置")]
public Vector3 dinoPos;
public GameObject dino;
public Vector3 vel;
public Vector3[] SummonPos = new Vector3[]
{
new Vector3(30f,3f,0),new Vector3(19.5f,3f,0)
};
private Rigidbody rig;
private SpriteRenderer spr;
public Sprite[] sp;
private bool isOn;
public Vector3