Unity3D开发入门教程(三)——添加启动脚本
五邑隐侠,本名关健昌,12年游戏生涯。 本教程以 Unity 3D + VS Code + C# + tolua 为例。
一、启动脚本
第一篇 “搭建开发环境”,在 “配置 Lua 开发环境” 一节提到,把 tolua 下的 Assets、Luajit、Luajit64、Unity5.x拷贝到工程根目录,简化 C#、Lua 互调。
先打开 Assets/Lua/Main.lua ,加上 OnUpdate() 方法(第6~8行)
1 --主入口函数。从这里开始lua逻辑
2 function Main()
3 print("logic start")
4 end
5
6 function OnUpdate()
7 print("Lua OnUpdate")
8 end
9
10 --场景切换通知
11 function OnLevelWasLoaded(level)
12 collectgarbage("collect")
13 Time.timeSinceLevelLoad = 0
14 end
15
16 function OnApplicationQuit()
17 end
新建目录CSharp用于存放C#脚本,新建一个C#脚本 Main.cs 作为启动脚本
1 using UnityEngine;
2 using LuaInterface;
3
4 public class Main : LuaClient
5 {
6 private LuaFunction updateFun = null;
7
8 // Start is called before the first frame update
9 void Start()
10 {
11 // bind OnUpdate
12 this.updateFun = luaState.GetFunction("OnUpdate");
13 }
14
15 new void OnApplicationQuit()
16 {
17 this.updateFun.Dispose();
18 this.updateFun = null;
19
20 base.OnApplicationQuit();
21 }
22
23 // Update is called once per frame
24 void Update()
25 {
26 this.updateFun.Call();
27 }
28 }
1、在Unity里,场景由GameObject组成。加载场景,会创建场景中的GameObject。
2、GameObject可以添加组件,组件基类为Component,但用户自定义的脚本都继承自MonoBehaviour(Component的子类)
3、Main类继承 LuaClient,LuaClient 继承 MonoBehaviour,所以 Main.cs 脚本可以作为组件添加到场景的 GameObject上。
4、组件有几个关键的生命周期:
1)Awake:只调用一次,在组件整个生命周期开始时调用,组件一般不建议写构造方法,需要提前初始的数据,可以在Awake初始化
2)Start:第一次Enable时调用,整个生命周期只调用一次,可以在这里初始化组件数据
3)Update:每帧调用一次
4)OnApplicationQuit:游戏退出时调用
5、LuaClient 在 Awake 里 初始化 Lua 环境,绑定C#类到Lua,然后加载 Assets/Lua/Main.lua 文件,并调用其中的 function Main() 方法,开始 Lua 逻辑。
6、luaState 是 LuaClient 的一个LuaState类型字段,保存 Lua 虚拟机对象。LuaState.GetFunction 获取 Lua一个返回LuaFunction类型的全局方法。第12行获取Lua 的 OnUpdate 方法,该方法在 Assets/Lua/Main.lua 里定义
7、LuaFunction.Call() 执行该Lua方法。第26行,组件Main每次 Update 时都 调用 Assets/Lua/Main.lua 的 OnUpdate 方法,驱动 Lua 逻辑更新。
二、Unity3D编辑器简介
1、层级管理面板
显示场景中所有的 GameObject,可以快速选中场景中的 GameObject

2、场景编辑面板
可视化编辑场景中GameObject位置

3、预览面板
预览场景运行的效果

4、属性面板
展示 GameObject 添加的组件,以及组件的属性。如图中选中 Main Camera 后显示该GameObject 的组件有Transform、Camera组件

5、工程面板
工程的资源仓库(脚本也是资源),用于搭建场景的零部件:脚本、声音、图片、预制体、场景等

三、添加启动脚本到场景
1、在工程面板选择Scenes文件夹,默认3D工程会生成一个SampleScene,如果没有,可以手动创建一个。双击这个场景图标,会打开该场景

2、在层级管理面板选择 Main Camera 这个 GameObject

3、在属性面板下方,点击 Add Component 按钮,选择 Scripts --> Main,这样场景运行时,Main脚本就会开始它的生命周期

4、作为启动脚本,我们希望它比其他脚本优先执行。在工程面板选择CSharp文件夹,选中Main脚本

5、在属性面板右上方,点击 Execution Order 按钮

6、添加Main脚本,并调整其顺序在 Default Time 之前

Unity3D开发入门教程(三)——添加启动脚本的更多相关文章
- Unity3D开发入门教程(四)——用Lua实现组件
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以 Unity 3D + VS Code + C# + tolua 为例. 一.Lua组件基类 1.在 Assets/Lua 目录下新建com目录用于存放 ...
- Unity3D开发入门教程(二)—— Lua入门
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以 Unity 3D + VS Code + C# + tolua 为例. 如果你还没有编程基础,建议你先学习一些编程基础.本文不是完全菜鸟教程,主要针对 ...
- iOS开发入门教程
iOS开发入门教程 http://my.oschina.net/mailzwj/blog/133273 摘要 iOS开发入门教程,从创建项目到运行项目,包括OC基础,调试,模拟器设置等相关知识. iO ...
- ENVI Services Engine5.1 应用开发入门教程
原文地址: ENVI Services Engine5.1 应用开发入门教程_ENVI-IDL中国_新浪博客 http://blog.sina.com.cn/s/blog_764b1e9d0102uy ...
- C#,ArcGIS Engine开发入门教程
C#,ArcGIS Engine开发入门教程 转自:http://blog.csdn.net/yanleigis/article/details/2233674 目录(?)[+] 五实现 一 加载A ...
- 基于Nodejs生态圈的TypeScript+React开发入门教程
基于Nodejs生态圈的TypeScript+React开发入门教程 概述 本教程旨在为基于Nodejs npm生态圈的前端程序开发提供入门讲解. Nodejs是什么 Nodejs是一个高性能Ja ...
- Arduino可穿戴开发入门教程(大学霸内部资料)
Arduino可穿戴开发入门教程(大学霸内部资料) 试读下载地址:链接:http://pan.baidu.com/s/1mg9To28 密码:z5v8 介绍:Arduino可穿戴开发入门教程(大学霸内 ...
- 一看就懂的Android APP开发入门教程
一看就懂的Android APP开发入门教程 作者: 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Android APP开发入门教程,从SDK下载.开发环境搭建.代码编写.APP打包等步骤 ...
- Android Studio JNI开发入门教程
Android Studio JNI开发入门教程 2016-08-29 14:38 3269人阅读 评论(0) 收藏 举报 分类: JNI(3) 目录(?)[+] 概述 在Andorid ...
随机推荐
- CF469A I Wanna Be the Guy 题解
Content 小 A 和小 B 正在玩一个游戏,游戏一共有 \(n\) 关,而两个人各只能通过 \(p_A,p_B\) 个关卡.问他们能否通过合作通关这个游戏. 数据范围:\(1\leqslant ...
- Spring核心原理分析之MVC九大组件(1)
本文节选自<Spring 5核心原理> 1 什么是Spring MVC Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 S ...
- 跨域:The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed
https://blog.csdn.net/q646926099/article/details/79082204 使用Ajax跨域请求资源,Nginx作为代理,出现:The 'Access-Cont ...
- 在执行java代码时,设置了断点,然后莫名的没执行完方法内的代码就结束了,此刻一般在出错处代码用try,catch包括起来
在执行java代码时,设置了断点,然后莫名的没执行完方法内的代码就结束了,此刻一般在出错处代码用try,catch包括起来就能看到是什么异常了,记住try,catch语句的作用
- SpringBoot整合nacos启动报错:java.lang.NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
报错信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nacosCo ...
- UDP&串口调试助手用法(1)
一览 UDP 串口 常用 功能概述 概览 支持UDP通信协议: 广播.单播.组播 支持串口通信 配置了常用的配置,常用的进制转化: 2进制,8进制,10进制,和16进制之间的转换 配置了 计算器,加减 ...
- spoj-SUBSUMS - Subset Sums
SUBSUMS - Subset Sums Given a sequence of N (1 ≤ N ≤ 34) numbers S1, ..., SN (-20,000,000 ≤ Si ≤ 20, ...
- 【LeetCode】817. Linked List Components 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- JVM调参
今天看了下之前做的一个异步处理任务的服务,发现占用内存量比较大,达到2G,但我检查了代码,基本没有static对象.但这个服务有个特点,就是每次执行一个任务的时候,会从数据库中捞大量的数据做处理,因此 ...
- 从头造轮子:python3 asyncio 之 run(2)
前言 书接上文,本文造第二个轮子,也是asyncio包里面非常常用的一个函数run 一.知识准备 ● 相对于run_until_complete,改动并不大,就是将入口函数重新封装了一下,基础知识主要 ...