3月8日
继续tank芜湖起飞,完成了移动和碰撞现在开始整发射子弹
这里首先学习一个十分常见的transform组件,所有你在场景中添加的组件在Inspector中都会有一个Transform组件。这个组建中包含了场景中每个物体的位置(Position),旋转(Rotation)和比例(Scale)信息。
通过transform,可以实现物体的运动,旋转,缩放等,具体用法可以参照这里
实现发射子弹很简单,只需要检测按键的按下,将子弹实例化就可以了
if (Input.GetKeyDown(KeyCode.Space))
//按下空格键
{
Instantiate(BulletPrefab, transform.position, transform.rotation);
//实例化方法( 预制体, 位置, 旋转角度)
}
这里的位置实际上是player的位置,用到了上面的transform方法
然后就是设置子弹的旋转,之前说到旋转有两种方法,一种是运用在tank上的不同方向设置不同图片,这里用另一种方法,即直接对贴图进行旋转。
由于旋转函数用的参数是四元数,而unity中的旋转角为xyz表示的三元数,因此这里需要进行一个转换
Quaternion.Euler(坦克的euler角+子弹的euler角)
2D游戏中旋转的方向是相反的,因为这是个左手系
之后只需要在调整坦克朝向的同时加上调整子弹的函数即可
bulletEulerAngles = new Vector3(0, 0, 180);
然后就是给子弹添加脚本,控制子弹的向前运动及触发检测
void Update()//简单的运动函数控制子弹运动
{
transform.Translate(transform.up * MoveSpeed * Time.deltaTime, Space.World);
}
}
给子弹预制体添加BoxCollider 2D,将Is Trigger勾选,就变成了触发器,再给子弹加上RigidBody 2D刚体,触发条件和碰撞条件类似,都是需要有一方有刚体。
下面是三个和触发器有关的函数
private void OnTriggerEnter2D(Collider other)//刚刚碰触到触发器时调用一次
{
print("此刻刚刚接触触发器");
print(other); //输出触发器所在的碰撞器类型
print(other.name); //输出触发器所属的物体的名字
print(other.tag); //输出触发器所属的物体的标签
}
private void OnTriggerStay2D(Collider other)//只要某部分在触发器中即不断调用
{
print("此刻正处于触发器中");
}
private void OnTriggerExit2D(Collider other)//完全离开触发器时调用一次
{
print("此刻刚刚整体脱离触发器");
}
当然如果是3D碰撞器,只需要去掉函数后面的2D即可
可以通过给各个物体添加标签来判断触发器碰到的是什么物体。
private void OnTriggerEnter2D(Collider2D collision)
{
switch (collision.tag)
{
case "Tank":
break;
case "Heart":
break;
case "Enemy":
break;
case "Wall":
break;
case "Barriar":
break;
}
}
做一个小优化:在地图四周加上空气墙,子弹碰到空气墙即消失,不然只生成不消失会十分浪费资源。
对于不同的碰撞检测,执行不同的方法
编写tank的死亡方法
private void Die()
{
if (isDefend)//如果无敌,则不调用下面的方法
return;
//产生爆炸特效
Instantiate(ExplosionPrefab, transform.position, transform.rotation);
//死亡
Destroy(gameObject);//销毁游戏物体
}
编写tank的初始无敌状态
private float defendTimeVal = 3;//无敌时间
private bool isDefend = true;//判断是否无敌
public GameObject defendEffectPrefab;//护盾特效
//是否处于无敌状态
if (isDefend)
{
defendEffectPrefab.SetActive(true);//护盾特效显示
defendTimeVal -= Time.deltaTime;
if(defendTimeVal <= 0)
{
defendEffectPrefab.SetActive(false);//护盾特效不显示
isDefend = false;
}
}