当前位置: 首页 > article >正文

unity3d入门教程六

unity3d入门教程六

  • 15.1预制体
  • 15.2编辑预制体
  • 15.3在场景中编辑
  • 15.4动态创建实例
  • 15.5实例的销毁
  • 16.1(练习)子弹发射
  • 16.2定时器
  • 16.3键盘事件

15.1预制体

火神山10天建成,使用了预制体技术

一个个小房间都是事先建造好的,最后吊车装配

Unity也有预制体技术
在这里插入图片描述

模拟这样一个游戏背景

飞机发射子弹,子弹很多,所以在游戏中动态的创建游戏对象,子弹对象,此时就需要预制体技术

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.2编辑预制体

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

然后退出预制体的编辑状态进行其他的操作
在这里插入图片描述

   void Update()
    {
        //另其向上移动
        float step = 1.8f * Time.deltaTime;
        transform.Translate(0, step, 0, Space.Self);
    }

在这里插入图片描述
在这里插入图片描述

预制体相当于模板,可以创建更多的相同的实例

15.3在场景中编辑

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

断开联系后,就可以单独更改一个实例不影响其他的

15.4动态创建实例

如飞机射子弹,要发出非常多的子弹,不能全放进去,而是游戏运行时自动创建出来的
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1 添加 MyJet.cs ,挂载到 ‘飞机’ 节点

2 添加公共变量

public GameObject myPrefab;

3 在 Inspector 中引用资源
在这里插入图片描述

4 当点击鼠标时,创建一个子弹的实例

GameObject bullet = Instantiate(myPrefab);
bullet.transform.position = transform.position + new Vector3(0, 1f, 0);

其中,Instantiate() 方法根据一个 Prefab ,来创建一个实例,返回值就是创建出来的GameObject 。

5 运行游戏
在 Hierarchy 窗口中,观察新创建的实例


Instantiate() 重载了很多版本,常用的如下:

bullet = Instantiate(myPrefab)

创建一个实例,position与rotation与当前游戏对象相当,挂载场景根节点下

bullet = Instantiate(myPrefab, Transform parent )

创建一个实例,position与rotation与当前游戏对象相当,同时指定父节点

bullet = Instantiate(myPrefab, position, rotation)

创建一个实例,挂载场景根节点下,同时指定 position与rotation
例如,

 bullet = Instantiate(myPrefab, transform.position, transform.rotation)
bullet = Instantiate(myPrefab, position, rotation, Transform parent)

创建一个实例,挂载 parent 节点下,同时指定 position与rotation

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class myjet2 : MonoBehaviour
{
    public GameObject myPrefab;
    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Fire();
        }
    }

    private void Fire()
    {
        //Instantiate方法可以将预制体资源创建为一个object
        GameObject bullet = Instantiate(myPrefab);
        bullet.transform.position = transform.position + new Vector3(0, 1f, 0);//创建位置放在飞机的上方
        bullet.name = "bullet";//更改创建的实例的名称
    }
}

15.5实例的销毁

在这里插入图片描述

之前点击一次创建一次子弹,创建的子弹会越来越多,需要将其销毁在合适的时机,即在消失在视野后进行销毁
在这里插入图片描述

将此脚本挂载到子弹的对象下,而不是飞机下,这样子弹自动被销毁
在这里插入图片描述

This指向的是当前组件,而实际要销毁的是游戏对象。

在这里插入图片描述

16.1(练习)子弹发射

在这里插入图片描述

使用键盘的左右键盘进行移动(键盘事件),并且自动不断发射子弹(需要定时器机制,如1秒2个子弹)

16.2定时器

在这里插入图片描述
在这里插入图片描述

子弹预制体对象上挂载的代码mybullet不用变,有自动向上移动和自我销毁功能

只需改变挂载到飞机上的代码即可,如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class myjet2 : MonoBehaviour
{
    //预制体资源 ‘子弹’
    public GameObject myPrefab;

    //定时
    private float interval = 0.4f;//计时,每个0.4秒发射一颗子弹
    private float count = 0;

    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {
        如果鼠标按下就发射
        //if (Input.GetMouseButtonDown(0))
        //{
        //    Fire();
        //}

        //计时,每个0.4秒发射一颗子弹
        count += Time.deltaTime;
        if (count >= interval)
        {
            count = 0;
            Fire();
        }

    }

    //发射开火子弹
    private void Fire()
    {
        //Instantiate方法可以将预制体资源创建为一个object
        GameObject bullet = Instantiate(myPrefab);
        bullet.transform.position = transform.position + new Vector3(0, 1f, 0);//创建位置放在飞机的上方
        bullet.name = "bullet";//更改创建的实例的名称
    }
}

16.3键盘事件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class myjet2 : MonoBehaviour
{
    //预制体资源 ‘子弹’
    public GameObject myPrefab;

    //定时
    private float interval = 0.4f;//计时,每个0.4秒发射一颗子弹
    private float count = 0;

    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {
        如果鼠标按下就发射
        //if (Input.GetMouseButtonDown(0))
        //{
        //    Fire();
        //}

        //计时,每个0.4秒发射一颗子弹
        count += Time.deltaTime;
        if (count >= interval)
        {
            count = 0;
            Fire();
        }

        //按键响应
        float step = 2.5f * Time.deltaTime;

        //若左键被按下(按下的状态是一直按着的,不是按下一次)
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Translate(-step, 0, 0);
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Translate(step, 0, 0);
        }

    }

    //发射开火子弹
    private void Fire()
    {
        //Instantiate方法可以将预制体资源创建为一个object
        GameObject bullet = Instantiate(myPrefab);
        bullet.transform.position = transform.position + new Vector3(0, 1f, 0);//创建位置放在飞机的上方
        bullet.name = "bullet";//更改创建的实例的名称
    }
}

http://www.kler.cn/news/307174.html

相关文章:

  • 校验(网络传输)
  • PHP环境搭建
  • 函数模板(初阶)
  • VuePress搭建文档网站/个人博客(详细配置)之站点配置
  • 海鲜市场|基于springboot的网络海鲜市场系设计与实现(附项目源码+论文+数据库)
  • item_get京东获取商品详情SKU数据接口||关于京东商品采集接口
  • Kubernetes 网络
  • 【C++】——list
  • 103.WEB渗透测试-信息收集-FOFA语法(3)
  • k8s中的lables和matchlables的作用
  • 54. 螺旋矩阵(定义四个方向然后遍历类)
  • 腾讯云升级多个云存储解决方案 以智能化存储助力企业增长
  • Java 入门指南:JVM(Java虚拟机)—— Java 类加载器详解
  • 【QGC】把QGroundControl地面站添加到Ubuntu侧边菜单栏启动
  • ElementUI 布局——行与列的灵活运用
  • Vue3 + Echarts 实现中国地图
  • 大数据处理技术:MapReduce综合实训
  • 【SSRF漏洞】——gopherus工具伪造
  • sqli-labs靶场自动化利用工具——第10关
  • 上汽大众:存储成本节约85%,查询性能提升5倍|OceanBase案例
  • 【Multi-UAV】多无人机实现凸多边形区域覆盖--Voronoi分割
  • Mysql树形结构表-查询所有子集数据
  • 【OJ刷题】快慢指针问题
  • ARM驱动学习之基础小知识
  • Windows环境本地部署Oracle 19c及卸载实操手册
  • STL-vector练习题
  • 【2025届华为秋招机考三道编程题之一】华为校招留学生软件开发工程师-真题机考笔试/(200分)- 跳格子3(Java JS Python C)
  • 【C++】模板进阶:深入解析模板特化
  • 【数据库】MySQL内置函数
  • Args4j:Java命令行参数解析的利器