上回我们用高中物理基本运动学知识不同方向的分速度完成了子弹的射击,射归射,得有个东西让咱射啊,于是方块君的宿敌五边形君终于要出场了!
相比之下,五边形君的行动就笨拙多了——他们只能靠人海战术取胜如果五边形君也会射击我还得写AI多麻烦啊哈哈哈。
那么我们的目的就很明确了:五边形君(们)将要从轨道就是个梯形上方一直到下方,当玩家和他碰撞将会GameOver,同时,五边形君到达最下方后将会消失
所以把子弹的脚本一颠倒,五边形君的运动就出来了——如果掌握了“继承”的概念面向对象必修课好吗,就会发现这个移动脚本可以适用于以后从上到下的所有物体
当然我的脚本还是很简陋(易于理解嘛)
public float xsetoff, speedx, speedy, falltime, xangle;
string dir;
public bool judgePlayer = false;
public int life;
GameObject controller;
void FixedUpdate()//和子弹不同的是,这里使用falltime也就是时间来判断五边形君是否到达底部——在以后会用到
{
transform.Translate(Vector2.down * Time.deltaTime * speedy);
if (dir == "left")
{
transform.Translate(Vector2.left * Time.deltaTime * speedx);
}
else if (dir == "right")
{
transform.Translate(Vector2.right * Time.deltaTime * speedx);
}
falltime -= Time.deltaTime;
if (falltime <= 0f && falltime >= -0.04f)//这里表示五边形君到达最下面可以判定玩家,之后我们会解释
{
judgePlayer = true;
}
else if (falltime < -0.04f)//0.04f的差值会使得玩家GameOver之后杀死玩家的敌人还留在画面上
{
Destroy(gameObject);
}
}
public void makeMove(float x, float t)//和子弹的代码比对,我们使用的是相反的计算
{
falltime = t;
if (x > 0)
{
dir = "right";
}
else if (x < 0)
{
dir = "left";
}
else
{
dir = "down";
}
xangle = 45f * Mathf.Abs(x) / 3.75f;
xsetoff = 5.0f * Mathf.Tan(xangle * Mathf.Deg2Rad);
speedx = xsetoff / falltime;
speedy = 5.0f / falltime;
}
现在,五边形君的移动就完成了——我们需要在主代码中产生它:
public void produceObject(GameObject obj){
if (obj == enemy)//先定义enemy(五边形君)的GameObject,然后使用prefab(common sense)
{
enemySetter = 0.0f;//计时器,你也可以使用Random.Range增加随机性
setx = Random.Range(-3.5f, 3.5f);//随机设定上部的产生位置
}
GameObject g = Instantiate(obj, new Vector2(setx, 3.0f), Quaternion.identity);
g.GetComponent<enemy>().makeMove(setx, falltime);
//由于只调用一个函数,也可以
//Instantiate(obj, new Vector2(setx, 3.0f), Quaternion.identity).GetComponent<enemy>().makeMove(setx, falltime);
}
之后再加上一个定时器,敌人的随机产生就完成了
然后是敌人和玩家(和子弹)的碰撞
大部分人都会使用OnTriggerEnter2D()吧
你们可以照着自己的思路来测试,如果各位和我一样是个萌新,就会陷入这样的难题:
敌人到最下面应该和玩家碰上了怎么没有判定啊啊啊啊啊
因为在你最后应该进行判定的时候玩家早就进入触发器了,所以无效
当然肯定会有更萌的萌新表示敌人还没到最下面就判定了!(……伪3D不是2D蟹蟹,要先克服这个困难)
然后想使用两个触发器分别处理子弹和玩家的碰撞……发现好像不行
所以我使用了一个bool,还有OnTriggerStay2D()
void OnTriggerStay2D(Collider2D collision)
{
if (collision.gameObject.name=="mainPlayer")
{
if (judgePlayer)//这里要看一下最上面的FixedUpdate()
{
Destroy(collision.gameObject);
}
}
}
不要忘了给物体加上RigidBody2D并且设定“静态”,否则触发器失效
对子弹同理:
if (collision.gameObject.name=="bullet(Clone)")
{
life--;//虽然是一击必杀但是该有的还得有吧……
if (life == 0)
{
Destroy(gameObject);
controller.GetComponent<mainScript>().scoreManage();
}
Destroy(collision.gameObject);
}
终于我们可以玩到一个“有挑战性“有吗?的游戏了……
这一次代码比较散乱,希望dalao们领会思路即可