unity3d入门教程六

unity3d入门教程六

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";//更改创建的实例的名称
    }
}
相关推荐
淡海水12 小时前
13-04-面试-源码级深度追问链
数据结构·unity·面试·c#·游戏引擎·源码·il2cpp
SmalBox1 天前
02-06-原理篇-热更新与版本管理
unity3d·游戏开发
小小数媒成员1 天前
UGUI 性能优化(详细,全,深入)
开发语言·unity·游戏引擎
SmalBox2 天前
02-05-原理篇-资源加载与缓存机制
unity3d·游戏开发
goujunwe2 天前
GEO 评估方法:如何自测你的内容,会不会被 AI 引用
搜索引擎·网络安全·游戏引擎·全文检索·中文分词
SmalBox2 天前
02-04-原理篇-资源组织与依赖分析
unity3d·游戏开发
林川~013 天前
Unity 常用 API 与核心类全解:从生命周期到协程,附性能避坑清单(Unity 6 适配)
unity·游戏引擎·常用api
SmalBox4 天前
02-03-原理篇-资源打包流程详解
unity3d·游戏开发
WiChP5 天前
【V0.1B16】从零开始的2D游戏引擎开发之路
开发语言·算法·游戏引擎
SmalBox5 天前
02-02-原理篇-Unity Addressable Assets原理深度解析
unity3d·游戏开发