IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity初学 -> 正文阅读

[游戏开发]Unity初学

Player游戏物体

从官方案例中获取模型并导入到Unity引擎中,给Player加上碰撞体和刚体组件,使其碰撞到敌人,敌人子弹或者陨石时爆炸,同时给Player增加碰撞时的爆炸粒子特效。
在这里插入图片描述
再给Player增加脚本实现上述功能

public class control : MonoBehaviour
{
    public float Speed = 3F;//飞船移动速度
    public Boundary boundary;
    public float tilt = 2F;//飞船倾斜角度
    //飞船刚体
    private Rigidbody rb;
    // Start is called before the first frame update
    //子弹
    public float FireRate = 0.8F;//发射子弹得频率
    public GameObject Bolt;//子弹预设
    public Transform BoltPosition;//子弹发射得方位
    private float NextFire = 0F;//下一次开火时间
    public GameObject Exprefab;
    public float ExTime = 2;
    void Start()
    {
        rb = this.GetComponent<Rigidbody>();//获得刚体
    }
    void Update()
    {
        if (Input.GetButton("Fire1")&&Time.time>NextFire)
        {
            //下一次开火时间
            NextFire = Time.time + FireRate;
            //克隆
            Instantiate(Bolt, BoltPosition.position, BoltPosition.rotation);
           
        }
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        //得到水平位移量
        float floMoveHorizontal = Input.GetAxis("Horizontal");
        //得到垂直位移量
        float floMoveVertiacl = Input.GetAxis("Vertical");
        //形成三维向量
        Vector3 move = new Vector3(floMoveHorizontal, 0, floMoveVertiacl);
        //计算出刚体速度
        //this.GetComponent<Rigidbody>().velocity = move * Speed;
        if (rb!=null)
        {
            //得到刚体速度
            rb.velocity= move * Speed;
            //限制刚体移动范围
            rb.position = new Vector3(Mathf.Clamp(rb.position.x,boundary.xMin,boundary.xMax),
                0.0F, 
                Mathf.Clamp(rb.position.z,boundary.zMin,boundary.zMax));
            //飞船倾斜角度
            rb.rotation = Quaternion.Euler(0.0F,0.0F,rb.velocity.x*-tilt);
        }
    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Enemy")|| other.CompareTag("Asteroid")||other.CompareTag("Enemybolt"))
        {
            GameObject ex = Instantiate(Exprefab, transform.position, Quaternion.identity);
            Destroy(other.gameObject);
            Destroy(gameObject);
            Destroy(ex, ExTime);
            GameControl.Instance.isGameOver = true;
        }
        
    }
}

陨石游戏物体

陨石是玩家要进行击碎的,并且撞击到玩家的子弹时会爆炸,并且陨石爆炸后会有爆炸效果,给陨石增加了刚体和碰撞体但是,需要让碰撞体的Is Trigger勾选,否则不会触发检测器,陨石碰撞后不会被销毁。
在这里插入图片描述

并给陨石增加脚本实现上述功能
public class Asteroid : MonoBehaviour
{
    public float moveMinspeed=1F;//陨石移动最小速度
    public float moveMaxspeed = 8F;//陨石移动最大速度
    public float RotateMinspeed = 30F;
    public float RotateMaxspeed = 60F;
    public float Rotatespeed;
    public GameObject Exprefab;
    public float ExTime=2;
    private float movespeed;//陨石速度
    public float DestroyTime = 30F;//销毁时间
    private float CurrentTime = 0F;//当前时间
    Rigidbody rb;
    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        movespeed = Random.Range(moveMinspeed, moveMaxspeed);
        //世界坐标
        rb.velocity = Vector3.back * movespeed;
        //角速度 旋转
        //Random.insideUnitSphere 返回向量Vector3有大小有方向
        rb.angularVelocity = Random.insideUnitSphere.normalized * Random.Range(RotateMinspeed, RotateMaxspeed) * Time.deltaTime;
    }

    // Update is called once per frame
    void Update()
    {
           CurrentTime += Time.deltaTime;//deltaTime帧间隔时间
        if (CurrentTime >= DestroyTime)
        {
            Destroy(this.gameObject);//销毁游戏物体
        }
    }
    //碰撞触发
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("bolt")||other.CompareTag("Player"))
        {
           GameObject ex= Instantiate(Exprefab, transform.position, Quaternion.identity);
            //删除子弹
            Destroy(other.gameObject);
            //删除自己
            Destroy(gameObject);
            //删除爆炸效果
            Destroy(ex, ExTime);
            GameControl.Instance.score += 10;
        }
    }
}

敌机游戏物体

设置敌机可以发射子弹,并且碰撞到玩家子弹和玩家时会爆炸,且碰撞后会出现粒子效果,给敌机加上刚体和碰撞体,且增加检测器,使物体接触时摧毁。
在这里插入图片描述
给敌机添加脚本实现上述功能

public class Enemy : MonoBehaviour
{
    public float moveEnemyspeed=20F;
    public GameObject Exprefab;
    public float ExTime = 2;
    Rigidbody rb;
    public float FireRate = 1F;//发射子弹得频率
    public GameObject EnemyBolt;//子弹预设
    public Transform EnemyBoltPosition;//子弹发射得方位
    private float NextFire = 0F;//下一次开火时间
    public float DestroyTime = 30F;//销毁时间
    private float CurrentTime = 0F;//当前时间
    // Start is called before the first frame update
    void Start()
    {
       
    }

    // Update is called once per frame
    void Update()
    {
       
        
        if (Time.time > NextFire)
        {
            //下一次开火时间
            NextFire = Time.time + FireRate;
            NextFire = Time.time + FireRate;
            Instantiate(EnemyBolt, EnemyBoltPosition.position, EnemyBoltPosition.rotation);
            

        }
        this.GetComponent<Rigidbody>().velocity = Vector3.back * moveEnemyspeed * Time.deltaTime;
        CurrentTime += Time.deltaTime;//deltaTime帧间隔时间
        if (CurrentTime >= DestroyTime)
        {
            Destroy(this.gameObject);//销毁游戏物体
        }
    }
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("bolt") || other.CompareTag("Player"))
        {
            GameObject ex = Instantiate(Exprefab, transform.position, Quaternion.identity);
            //删除子弹
            Destroy(other.gameObject);
            //删除自己
            Destroy(gameObject);
            //删除爆炸效果
            Destroy(ex, ExTime);
            GameControl.Instance.score += 20;
        }
        
    }
}

敌机以及玩家子弹

给子弹增加速度,以及射出位置,以及碰撞体和刚体,使其碰撞到敌机和陨石时销毁,并且子弹在飞出屏幕后在一定时间会自动销毁。
在这里插入图片描述
给子弹添加脚本,实现上述功能

public class moving : MonoBehaviour
{
    public float boltspeed = 4F;//子弹移动速度
    public float DestroyTime = 4F;//销毁时间
    private float CurrentTime = 0F;//当前时间
    // Start is called before the first frame update
    void Start()
    {
        this.GetComponent<Rigidbody>().velocity = transform.forward * boltspeed;
    }

    // Update is called once per frame
    void Update()
    {
        CurrentTime += Time.deltaTime;//deltaTime帧间隔时间
        if (CurrentTime >= DestroyTime)
        {
            Destroy(this.gameObject);//销毁游戏物体
            
        }
    }
}

游戏控制器

实现循环,使游戏持续运行。直到人物死亡后按R重来。下面是游戏控制器的脚本组件

public class GameControl : MonoBehaviour
{
    public int score;
    public bool isGameOver = false;
    public GameObject gameover;
    public GameObject[] enemyprefab;
    public float StartTime = 3F;
    public float enemyFate = 0.3F;
    public float enemyNum = 10;
    public float waveFate = 2F;
    // Start is called before the first frame update
    private static GameControl instance;
    public static GameControl Instance
    {
        get { return instance; }
    }
    private void Awake()
    {
        if (instance == null)
            instance = this;
    }
    void Start()
    {
        //启动协同程序
        StartCoroutine("SpwanEnemy");
    }

    // Update is called once per frame
    void Update()
    {
        if (isGameOver)
        {
            gameover.SetActive(true);
            if (Input.GetKeyDown(KeyCode.R))
            {
                SceneManager.LoadScene(0);
            }
        }
    }
    IEnumerator SpwanEnemy()
    {

        yield return new WaitForSeconds(StartTime);
        
        //无限循环
        while (true)
        {
            for (int i = 0; i < enemyNum; i++)
            {
                GameObject enemy = enemyprefab[Random.Range(0, enemyprefab.Length)];
                Vector3 pos = new Vector3(Random.Range(-4F, 4F), 0, 12);
                Instantiate(enemy, pos, enemy.transform.rotation);
                yield return new WaitForSeconds(enemyFate);

            }
            enemyNum++;
            yield return new WaitForSeconds(waveFate);
            if (isGameOver)
                break;
        }
    }
    private void OnGUI()
    {
        GUI.Label(new Rect(350, 0, 100, 50), "分数:" + score);
        if (isGameOver)
        {
            GUI.Label(new Rect(0, 0, 100, 20), "GameOver");
            if (isGameOver)
            {
                GUI.Label(new Rect(Screen.width - 200, 0, 200, 20), "请按'R'键重新开始游戏");
            }
        }
    }
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-02-03 01:27:13  更:2022-02-03 01:27:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 18:21:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码