当前位置:   article > 正文

【Unity学习笔记】大三下学期 射击类小游戏制作_unity做射击游戏难吗

unity做射击游戏难吗

虽然大二寒假做过一次,但已经快忘光光了。。
所以这次要认真记录一下知识点!
//0415更新
新添实现敌机生成、单例模式添加音乐特效等
//0408更新
总共实现了背景轮播、控制飞机走动、发射子弹的功能。

有关背景图轮播

就是两块Image顺序向下滚动,当第一张图片顶部走出摄像机视野范围时,将其的位置改变到第二张图片的上方 (我也不知道咋描述,反正以后我自己能看懂就行嘿嘿)
在这里插入图片描述

void Update()
    {
        this.transform.Translate(Vector3.down * moveSpeed * Time.deltaTime);
        if (transform.position.y <= -BGLong)
        {
            transform.position =new Vector3(transform.position.x,transform.position.y+BGLong * 2,transform.position.z);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

有关发射子弹

1、首先先调整好子弹模型

以后切记一定要调整好模型的大小、缩放比例、旋转角度等,再在外面套个空物体!!所有操作只需在外面那层空物体上执行即可,模型就只是model,调整好了就不用再管它啦!
切记调位置调父物体,调角度调子物体(子物体位置(0,0,0)即可)!!!
还有切记也要调整好子物体与父物体之间的位置关系,一般情况下子物体位置都设成(0,0,0)即可,这个是相对位置,即相对父物体的位置差(也就是跟父物体在同一位置上)。
在这里插入图片描述
(特别是这种套中套中套的关系,一定要整理好各自之间的位置)

2、然后建好子弹生成位置

首先在Player下新建几个空物体,调整好位置、角度,后期子弹生成会按照此位置和角度生成。
注:可以给空物体加上颜色标识符,便于我们确定空物体的位置。
在这里插入图片描述

3、编写脚本生成子弹

在playerMove里编写子弹生成代码

void gunFire()
    {
        gameMessage.instance.PlayAudioClip("shoot");
        //导入预置体
        GameObject bullet = Resources.Load<GameObject>("bullet");
       //获取开火口下的子物体位置
        for (int i = 0; i < fireTrans.childCount; i++)
        {
        //将子物体位置赋值给子弹
           GameObject bullet1= Instantiate(bullet,fireTrans.GetChild(i).position, fireTrans.GetChild(i).rotation);
           // bullet1.transform.SetParent(fireTrans.GetChild(i).transform);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

然后在update里调用 按下鼠标右键发设子弹

if (Input.GetMouseButtonDown(0))
        {
            gunFire();
        }
  • 1
  • 2
  • 3
  • 4
4、编写控制子弹脚本

新建控制子弹脚本,并把它挂到子弹预置体上,需要实现子弹向上运动,以及三秒钟销毁、碰到敌人给敌人减血等功能。

void Update()
    {
        this.transform.Translate(new Vector3(0,1,0)* gunSpeed * Time.deltaTime);
        Destroy(gameObject, 3);
    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "Enemy")
        {
            other.gameObject.GetComponent<EnemyHP>().enemyHP -= 30;
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

有关控制飞机走动

实现wasd键控制上下左右移动即可

float x = Input.GetAxis("Horizontal");
        float y = Input.GetAxis("Vertical");
        this.transform.Translate(new Vector3(x, y, 0) * playerSpeed);
  • 1
  • 2
  • 3

有关实现敌机生成

每隔几秒随机生成一个敌机,并给它设定好位置范围即可

public class EnemyCreate : MonoBehaviour
{
    public GameObject[] Enemys;
    void Start()
    {
        //每延迟5秒执行一次
        InvokeRepeating("_EnemyBirth", 5, 1);
    }
    //生成敌人
    public void _EnemyBirth()
    {
    	//随机生成敌人类型
        int i = Random.Range(0, Enemys.Length);
        GameObject obj = Instantiate(Enemys[i]);
        
        //随机生成敌人坐标(只需随机生成X轴即可,让敌机贴着背景最上面那个范围生成即可)
        float x = Random.Range(7.5f,12.5f);
        obj.transform.position = new Vector3(x, 5.5f, 9f);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

有关敌机血量以及分数控制

1、敌机的血量控制

新建一个EnemyHP,加在敌机预置体上,控制敌机血量
敌机血量初始值100,每被一个子弹击中都会减血量30,被打到四次便会击毙。

public class EnemyHP : MonoBehaviour
{
    public int enemyHP = 100;
    private float enemySpeed = 2f;
    void Update()
    {
    	//敌机向下飞行
        this.transform.Translate(new Vector3(0, -1, 0) * enemySpeed * Time.deltaTime);
        if (enemyHP <= 0)
        {
            Destroy(gameObject);
            UIText.score++;
        } 
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在控制子弹脚本里可以调用EnemyHP脚本中的enemyHP变量来给敌机减血。

  private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "Enemy")
        {
            other.gameObject.GetComponent<EnemyHP>().enemyHP -= 30;
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

敌机脚本的分数加一操作

  if (enemyHP <= 0)
        {
            Destroy(gameObject);
            UIText.score++;
        } 
  • 1
  • 2
  • 3
  • 4
  • 5

这样设置一个静态变量相当于多个脚本都可以对此变量进行操作

2、分数控制

新建UIText脚本,管理玩家的分数。将score设成全局变量,这样所有的敌机脚本当执行摧毁敌机函数时,都可以对此变量进行加1操作

public class UIText : MonoBehaviour
{
    public Text text;
    //静态变量,多脚本改变这一个值
    public static int score=0;
    // Update is called once per frame
    void Update()
    {
        text.text = "分数"+score;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

有关音效控制的单例模式

单例模式即把整个脚本设成唯一的全局变量

public class gameMessage : MonoBehaviour
{
    //整个脚本都是全局变量,在其他脚本都可以调用此脚本中的变量、函数
    //单例模式
    public static gameMessage instance;
    public AudioSource audioSouce;
    //音乐数组
    public AudioClip[] audioClip;
    Dictionary<string, AudioClip> dictionary = new Dictionary<string, AudioClip>();
    void Start()
    {
        //声明一下
        instance = this;

        foreach(AudioClip clip in audioClip)
        {
            //向字典里储存
            dictionary.Add(clip.name, clip);
        }
    }
    void Update()
    {
        
    }
    /// <summary>
    /// 播放音乐片段
    /// </summary>
    /// <param name="audioName"></param>
    public void PlayAudioClip(string audioName)
    {
        //判断字典中是否包含key=audioName
        if (dictionary.ContainsKey(audioName))
        {
            AudioClip clipp = dictionary[audioName];
            audioSouce.clip = clipp;
            audioSouce.Play();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

在别的脚本里便可以随意调用此脚本里的函数和变量
比如说就在开火函数里就可以调用函数播放背景音乐

void gunFire()
    {
        gameMessage.instance.PlayAudioClip("shoot");
       。。。。。
    }
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/104179?site
推荐阅读
相关标签
  

闽ICP备14008679号