游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:775

当前位置:游戏蛮牛 技术专区 教程分享

查看: 621|回复: 3

[系列教程] 从零开始学基于ARKit的Unity3d游戏开发系列17

[复制链接]  [移动端链接]
排名
44647
昨日变化
30

41

主题

41

帖子

125

积分

Rank: 9Rank: 9Rank: 9

UID
257049
好友
0
蛮牛币
629
威望
0
注册时间
2017-11-30
在线时间
27 小时
最后登录
2018-2-1

专栏作家

发表于 2018-1-11 15:13:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 ifreecode 于 2018-1-11 17:09 编辑

在上一课的内容中,我们添加了弹药的UI元素。在这一课的内容中,我们将添加相应的脚本。

打开Unity编辑器,在Hierarchy视图中选中CameraParent下面Main Camera的子对象weapon1,然后从Inspector视图中打开ShootEnemy脚本文件。

在Start方法的前面添加以下代码:

        //创建到弹药UI元素的引用
        public Text ammo1Text;
        public Text ammo2Text;
        public int ammo1;
        public int ammo2;


以上我们创建了到弹药UI元素的引用,以及弹药的具体数量。

然后在Hierarchy视图中找到Canvas下的Weapon1的子对象ammoText和ammoText2,并将其分别拖动到Inspector视图中Shoot Enemy组件的Ammo1 Text和Ammo2 Text。如图所示:

图片23.png

接下来回到ShootEnemy脚本,在Start方法的最后添加以下代码:

                //设置弹药数量的初始值
                ammo1 = 20;
                ammo2 = 100;


然后在OnShoot方法的最开始添加以下代码:

                //弹药数量减少
                ammo1 -= 1;
                string ammo1String = (ammo1).ToString ();
                ammo1Text.text = ammo1String;

                ammo2 -= 1;
                string ammo2String = (ammo2).ToString ();
                ammo2Text.text = ammo2String;


回到Unity主编辑器,点击工具栏上的Play按钮预览游戏效果。

图片24.png

此时脚本起作用了,但是似乎少了点东西。是的,少了个/符号。


回到ShootEnemy.cs脚本文件,修改刚才的代码如下:

                //弹药数量减少
                ammo1 -= 1;
                string ammo1String = (ammo1).ToString ();
                ammo1Text.text = ammo1String;

                ammo2 -= 1;
                string ammo2String = (ammo2).ToString ();
                ammo2Text.text = "/"+ ammo2String;

接下来测试,发现弹药数量竟然可以减少到负数,显然是不科学的。

回到ShootEnemy.cs脚本,修改其中的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//import namespace
using UnityEngine.UI;

public class ShootEnemy : MonoBehaviour {

        //创建到Button对象的引用
        public Button shootBtn;
        //创建到主摄像机的引用
        public Camera fpsCam;

        //设置敌人每次受到伤害的数值
        public float damage = 10f;

        //敌人受伤的粒子特效
        public GameObject bloodEffect;

        //攻击的粒子特效

        public GameObject shootingEffect;

        //添加的攻击力度
        public int forceAdd = 300;

        //定义两个音源对象
        AudioSource shootSound;
        AudioSource reloadSound;


        //创建到弹药UI元素的引用
        public Text ammo1Text;
        public Text ammo2Text;
        public int ammo1;
        public int ammo2;

        private bool ammoIsEmpty;


        // Use this for initialization
        void Start () {


                //Debug.Log ("Activated!");
                //添加按钮的响应事件
                shootBtn.onClick.AddListener (OnShoot);

                //获取音源组件
                AudioSource[] audios = GetComponents<AudioSource>();

                //设置音源
                shootSound = audios [0];
                reloadSound = audios [1];

                //设置弹药数量的初始值
                ammo1 = 20;
                ammo2 = 100;
        }

        public void OnShoot(){

                //仅在ammoIsEmpty为真时才可执行逻辑判断中的操作
                if (!ammoIsEmpty) {
               
                        if (ammo1 == 1) {

                                ammo1 = 21;
                        }



                        //弹药数量减少
                        ammo1 -= 1;
                        string ammo1String = (ammo1).ToString ();
                        ammo1Text.text = ammo1String;

                        ammo2 -= 1;
                        string ammo2String = (ammo2).ToString ();
                        ammo2Text.text = "/"+ ammo2String;


                        //如果弹药总数量为0,则设置ammoIsEmpty为true
                        if (ammo2 == 0) {

                                ammoIsEmpty = true;
                                ammo1 = 0;
                                string ammoTempString = (ammo1).ToString ();
                                ammo1Text.text = ammoTempString;

                        }


                        //播放音效
                        shootSound.Play();

                        Debug.Log ("shooting!");

                        //定义一个RaycastHit类型变量,用于保存检测信息
                        RaycastHit hit;

                        //判断是否检测到命中敌人
                        if (Physics.Raycast (fpsCam.transform.position, fpsCam.transform.forward, out hit)) {


                                //获取所受攻击的敌人
                                Enemy target = hit.transform.GetComponent<Enemy>();

                                //destroy enemy

                                if (target != null) {

                                        //instantiate blood effect

                                        target.TakeDamage (damage);
                                        //创建敌人受伤的粒子特效

                                        GameObject bloodBurst = Instantiate (bloodEffect, hit.point, Quaternion.LookRotation (hit.normal));

                                        //0.2秒后销毁粒子特效

                                        Destroy (bloodBurst, 0.2f);
                                }  else {
                                        //load shooting effect

                                        //如果没有击中敌人,则创建攻击时的粒子特效

                                        GameObject shootingGo =        Instantiate (shootingEffect, hit.point, Quaternion.LookRotation (hit.normal));

                                        //0.2秒后销毁粒子特效
                                        Destroy (shootingGo,0.2f);

                                }


                                //攻击敌人时添加一个额外的冲击力

                                if (hit.rigidbody != null) {

                                        hit.rigidbody.AddForce (-hit.normal * forceAdd);

                                }


                                //输出所命中的对象名称
                                Debug.Log (hit.transform.name);


                        }

                }

        }

}

在以上的代码中,我们主要是添加了一个逻辑判断,使用布尔变量isAmmoEmpty来判断弹药总量是否没有减少到0.仅当有弹药时才会执行后面的操作。

修改完成后回到Unity主编辑器,点击Play按钮预览游戏效果,测试一下,直到弹药数量减少为0,看看是否一切正常。

图片25.png

好了,本课的内容到此结束,我们下一课再见~

温馨提示:
本系列图文连载内容首发于我的微信公众号,2018年1月5日起,每周至少更新一次。
图片1.png
如果你有关于虚拟现实方面的任何问题,欢迎关注我的微信公众号:vrlife,参与互动问答。



回复

使用道具 举报

7日久生情
2535/5000
排名
3448
昨日变化
2

2

主题

1780

帖子

2535

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
241666
好友
0
蛮牛币
10199
威望
0
注册时间
2017-9-6
在线时间
362 小时
最后登录
2018-6-7
发表于 2018-1-12 07:21:35 来自Mobile--- | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
3060/5000
排名
2413
昨日变化
7

0

主题

2082

帖子

3060

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
1
蛮牛币
2502
威望
0
注册时间
2017-7-12
在线时间
440 小时
最后登录
2018-7-19

活力之星

发表于 2018-1-12 11:56:36 | 显示全部楼层
谢谢分享

回复

使用道具 举报

5熟悉之中
903/1000
排名
3246
昨日变化
1

0

主题

235

帖子

903

积分

Rank: 5Rank: 5

UID
119648
好友
3
蛮牛币
1381
威望
0
注册时间
2015-8-25
在线时间
260 小时
最后登录
2018-7-12
QQ
发表于 2018-3-7 14:09:34 | 显示全部楼层
感谢分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表