查看: 52283|回复: 71

【飞机大战】开发手记(三)导弹发射控制

[复制链接]

1

主题

342

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
75866
发表于 2014-9-4 04:58:54 | 显示全部楼层 |阅读模式
在《飞机大战》中,飞机初始每次只发射一枚子弹,当获得强化道具后就会变为每次同时发射两枚子弹。 为确保能在后期方便地加入更多的子弹类型,可以将每种子弹保存为一个预设,并由上一篇中的AircraftController来控制。这里直接记录强化后的子弹的制作,普通子弹的做法是相同的。

首先像前文中所述,如法炮制创建一个子弹的精灵集合,并在层次面板中创建它。
然后创建一个Missile.cs脚本,用以实现子弹的相关行为(目前的逻辑只有以一定的速度移动,当移出屏幕之后销毁)。
namespace Frederick.ProjectAircraft{    using UnityEngine;      ///     /// 导弹。    ///     [RequireComponent(typeof (BoxCollider))]    public class Missile : MonoBehaviour    {        public float StantardSpeed = 800;          protected void Awake()        {            mTransform = transform;        }          protected void Update()        {            var position = mTransform.localPosition + mDirection * StantardSpeed * Time.deltaTime;            if (position.y > 960)            {                Destroy(gameObject);                return;            }            mTransform.localPosition = position;        }          private readonly Vector3 mDirection = Vector3.up;        private Transform mTransform;    }}
将脚本附加到Missile对象上,并设置好速度属性。点击运行游戏测试一下,子弹会向着屏幕上方飞去,并且在超出屏幕后自动销毁。 【飞机大战】开发手记(三)导弹发射控制
选中层次面板中的Missile对象,按Ctrl+D复制一份,分别重命名为Missile_Left和Missile_Right,再将两个Missile拖入到一个新建的Missile_Double对象中。然后分别将Missile_Left和Missile_Right的X坐标调整为-32和32。最后在工程面板中创建目录Prefabs,在目录下创建一个空的Prefab并把Missile_Double拖入,一个强化子弹类型预设就完成了(可以用同样的方式创建Missile_Single)。

【飞机大战】开发手记(三)导弹发射控制

光有子弹还不够,还需要为飞机增加一个导弹发射器来发射。



namespace Frederick.ProjectAircraft
{
    using UnityEngine;

    ///
    /// 导弹发射器。
    ///
    public class MissileLauncher : MonoBehaviour
    {
        public int MissileIndex;
        public GameObject[] MissilePrefabs;

        ///
        /// 发射导弹。
        ///
        public void Launch()
        {
            if (MissileIndex < 0 || MissileIndex > MissilePrefabs.Length)
                return;
            var prefab = MissilePrefabs[MissileIndex];
            var missileRoot = (GameObject) Instantiate(prefab, mTransform.position, Quaternion.identity);
            missileRoot.transform.DetachChildren();
            Destroy(missileRoot);
        }

        protected void Awake()
        {
            mTransform = transform;
        }

        private Transform mTransform;
    }
}


创建完成后Aircraft如图所示。

【飞机大战】开发手记(三)导弹发射控制

最后在AircraftController中增加调用发射器的功能。



namespace Frederick.ProjectAircraft
{
    using UnityEngine;

    ///
    /// 玩家飞机控制器。
    ///
    [RequireComponent(typeof (BoxCollider))]
    public class AircraftController : MonoBehaviour
    {
        ///
        /// 将飞机移动到指定位置。
        ///
        ///目标位置
        public void MoveTo(Vector3 pos)
        {
            mAircraft.localPosition = pos;
        }

        protected void Awake()
        {
            mAircraft = transform;
            mMissileLauncher = GetComponentInChildren();
        }

        protected void OnMouseDown()
        {
            mIsDragging = true;
            mOffset = Input.mousePosition - mAircraft.localPosition;
        }

        protected void OnMouseUp()
        {
            mIsDragging = false;
        }

        protected void Update()
        {
            //移动控制
            if (mIsDragging && Input.GetMouseButton(0))
            {
                var pos = Input.mousePosition - mOffset;
                MoveTo(pos);
            }

            //导弹控制
            if (mLastLaunchElapsedTime > mLaunchCooldown)
            {
                mLastLaunchElapsedTime = 0;
                mMissileLauncher.Launch();
            }
            else
            {
                mLastLaunchElapsedTime += Time.deltaTime;
            }
        }

        private Transform mAircraft;
        private bool mIsDragging;
        private float mLastLaunchElapsedTime = float.MaxValue;
        private float mLaunchCooldown = 0.3f;
        private MissileLauncher mMissileLauncher;
        private Vector3 mOffset;
    }
}




运行游戏,飞机已经可以自动发射导弹了。调整MissileLauncher的MissileIndex,还可以切换两种子弹,是不是很酷:)

【飞机大战】开发手记(三)导弹发射控制
回复

使用道具 举报

xuexinzhe 该用户已被删除
发表于 2014-12-29 02:21:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

gfjhrtuyt3n7 该用户已被删除
发表于 2014-12-29 20:21:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

1241

帖子

3932

积分

vip会员

Rank: 1

积分
3932
发表于 2015-4-6 23:25:18 来自手机 | 显示全部楼层
支持,这个很稀有的说
回复 支持 反对

使用道具 举报

0

主题

1277

帖子

3949

积分

vip会员

Rank: 1

积分
3949
发表于 2015-4-7 13:35:18 来自手机 | 显示全部楼层
不错 支持一个了
回复 支持 反对

使用道具 举报

简单 该用户已被删除
发表于 2015-4-7 20:35:44 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

1308

帖子

4012

积分

vip会员

Rank: 1

积分
4012
发表于 2015-4-10 14:45:01 来自手机 | 显示全部楼层
……
回复 支持 反对

使用道具 举报

0

主题

1271

帖子

3982

积分

vip会员

Rank: 1

积分
3982
发表于 2015-4-15 09:47:22 来自手机 | 显示全部楼层
路过 帮顶 嘿嘿
回复 支持 反对

使用道具 举报

0

主题

1243

帖子

3936

积分

vip会员

Rank: 1

积分
3936
发表于 2015-4-17 02:48:41 来自手机 | 显示全部楼层
好,很好,非常好!
回复 支持 反对

使用道具 举报

体会 该用户已被删除
发表于 2015-4-17 18:40:53 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | enginedx注册

本版积分规则

 
 



邮件留言:


 
返回顶部