Unity3D案例太空射击(Space Shooter)流程介绍与代码分析(上)

最近开始接触游戏制作,用Unity制作一些简单的游戏进行入门。这几篇博客总结了Space Shooter的制作流程,并对代码进行了分析。一是方便自己日后进行回顾与补充,二是为了让让更多的游戏爱好者接触游戏开发,少走弯路。
Space Shooter是一个入门级的项目,很适合新手学习。借由这款游戏,我们可以了解Unity中的界面以及常用操作,并对整个引擎有个笼统的认知,代码只需要一些编程基础,门槛不高(主要是C#)
说回正题,制作这款游戏需要如下资料。
泰课在线免费教学课程: http://www.taikr.com/my/course/63 (需要进行注册)
Unity软件以及资源包: http://download.csdn.net/download/s1314_jhc/10239210 下载分不够的私聊我发链接
(资源包含:Unity4.6.9软件安装包、破解器、破解教程以及Space Shooter资源包)
以上就是准备工作,接下来就可以正式进入这个游戏开发之中。具体操作参见视频。 本博客侧重于步骤梳理以及代码分析,不足之处敬请指正,也欢迎各位留言交流问题与看法。

博客结构分为三部分
第一部分为游戏基本素材的添加。包括飞机、背景、灯光以及子弹的添加,涉及到一些基本的代码操作。
第二部分为游戏基本功能的实现,包括陨石的产生、碰撞等操作。
第三部分为游戏性能的完善部分,包括音效、计分,销毁以及游戏结束后的重新加载部分。

传送门:
太空射击(Space Shooter)流程介绍与代码分析(上)

1.添加飞机
添加飞机是完成该游戏的第一步,首先,将素材导入进Asset中,将飞机部件拖入编辑环境中,调整Roatation使飞机处在摄像机的视角内。



此时的飞机只是一个静止的图片,为了检测飞机是否与子弹发生碰撞,我们需要加入一个 碰撞检测器,在Inspector中的Add Component中添加一个Mesh Collider,再将下图中文件拖入Mesh中,完成添加,之后只要去掉Mesh Renderer,即可看到下右图中的刚体文件。

        

除此之外,我们需要加入一个rigidbody(刚体,操作类似添加Mesh Collider),将重力去除。



之后,为了模拟真实飞机情况,我们加入飞机的火焰喷射效果,将Prefabs中的engineer拖动至playerShip中,并设置位置,使喷射器与飞机结合,如下图。


以上就完成了简单的第一步,可以看到一架飞机正在待命!



2.添加灯光与背景
上述的操作只是添加了一个飞机,整个飞机的纹理特性不能很好地看出,因此需要加入一些灯光效果。在GameObject中添加Light——Directional Light,灯光的亮度又途中红框部分决定,可以自定义设定。并且Intensity可以调节灯光强度。


同理,可以再添加一个灯光(Fill Light),与之前添加的灯光效果形成叠加,增强立体感。如下所示。


背景的添加通过以下步骤完成:新建一个空的GameObject,并将背景素材拖入。

3.飞机控制

在playership中新建一个new script,用以控制玩家飞机的移动。在脚本中输入
using UnityEngine;
using System.Collections;
public class PlayeControl : MonoBehaviour {
    public float speed = 10f;
    void fixedUpdate()
    {
        float h = Input.GetAxis("Horizontal");    //飞机的水平移动
        float v = Input.GetAxis("Vertical");    //飞机的垂直移动
        Vector3 move = new Vector3 (h, 0f, v);    //移动数据赋值给move
        rigidbody.velocity = speed * move;    
    }
}
即可,此时飞机可以实现运动功能,但是范围却无法限定,因此对上述代码进行修改,在Game模式下,获取飞机的x,z信息以设置PlayerShip的活动范围


using UnityEngine;
using System.Collections;
public class PlayeControl : MonoBehaviour {
    public float speed = 10f;
    public float xMin = -10.15f;//移动范围
    public float xMax = -1.69f;
    public float yMin = -6.66f;
    public float yMax = 10.90f;
    void FixedUpdate()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector3 move = new Vector3 (h, v, 0f);
        rigidbody.velocity = speed * move;
        rigidbody.position = new Vector3
        (
            Mathf.Clamp(rigidbody.position.x,xMin,xMax),    //用Clamp函数对范围进行限制
            Mathf.Clamp(rigidbody.position.y,yMin,yMax),
            1.3f
        );
    }
}
即可

4.创建子弹
新建一个空的object,再新建一个quad,将


为了去除子弹的背景黑框,将背景设置为additive


之后,为子弹添加一个rigidbody,参见飞机PlayerShip的设置,去除gravity,并新建一个脚本反映子弹运动,如下
using UnityEngine;
using System.Collections;
public class BulletMovement : MonoBehaviour {
    public float speed = 10f;
    // Use this for initialization
    void Start () {
        rigidbody.velocity = transform.up* speed;    //子弹运动
    }
    
}
即可
之后就可以看见子弹沿着垂直方向往上运动并最终消失的场景,可以通过更改speed以改变运动速度。
子弹在运动中会碰到敌机或者陨石,这时候我们就要判断子弹是否与物体发生碰撞,我们在Bullet中加入一个Capsule Collider以检测子弹是否与物体发生碰撞,将半径(radius)与高度(height)设置好即可。


5.发射子弹
随着飞机的移动,子弹发射点也要随着飞机进行移动,因此在playership中创建一个空object记录子弹位置。(采用bulletPosition表示)
对playerControl函数中进行修改
using UnityEngine;
using System.Collections;
public class PlayeControl : MonoBehaviour {
    public float speed = 10f;
    public GameObject bullet;    //创建子弹
    public GameObject bulletPosition;    //创建子弹发射位置
    public float xMin = -10.15f;
    public float xMax = -1.69f;
    public float yMin = -6.66f;
    public float yMax = 10.90f;
    void FixedUpdate()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector3 move = new Vector3 (h, v, 0f);
        rigidbody.velocity = speed * move;
        rigidbody.position = new Vector3
        (
            Mathf.Clamp(rigidbody.position.x,xMin,xMax),   
            Mathf.Clamp(rigidbody.position.y,yMin,yMax),
            1.3f
        );
    }
    void Update()
    {
        if (Input.GetButton ("Fire1"))
        {
            Instantiate    //子弹射击函数
                (
                bullet,
                bulletPosition.transform.position,
                bulletPosition.transform.rotation
                    );
        }
    }
}
并按照下左图操作将代码中创建的两个实例填充,即可实现发射子弹功能,但此时的子弹发射过快并且会四处散开,如下右所示


只需l勾选子弹VFX中的的Is Trigger以及给子弹一个发射限制函数即可,Is Trigger属性勾选表示物体不受作用力的影响,相当于一个虚体,但能产生碰撞事件。


代码中加入
    public float fireRate = 0.25f; //一秒最多发射4发
    private float nextFireTime;    
以及将Update中if函数修改为
if (Input.GetKeyDown(KeyCode.Space)&&Time.time > nextFireTime)    //按空格发射并受到发射频率的限制
        {
            nextFireTime = Time.time + fireRate;
            Instantiate    
                (
                bullet,
                bulletPosition.transform.position,
                bulletPosition.transform.rotation
                    );
        }

即可

以上就是基本素材的添加及相应的代码操作,之后将会介绍核心的游戏功能代码。

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值