unity从0开始摸鱼日记4,tkDemo3

3月8日

继续tank芜湖起飞,完成了移动和碰撞现在开始整发射子弹

这里首先学习一个十分常见的transform组件,所有你在场景中添加的组件在Inspector中都会有一个Transform组件。这个组建中包含了场景中每个物体的位置(Position),旋转(Rotation)和比例(Scale)信息。

通过transform,可以实现物体的运动,旋转,缩放等,具体用法可以参照这里

【Unity3d开发基础】场景中物体的变换

实现发射子弹很简单,只需要检测按键的按下,将子弹实例化就可以了

 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;
            }
        }
发布了39 篇原创文章 · 获赞 0 · 访问量 1450

猜你喜欢

转载自blog.csdn.net/Z3Djoker/article/details/104733353