首页 > 其他分享 >Unity3D学习之路

Unity3D学习之路

时间:2022-12-27 19:33:43浏览次数:75  
标签:Unity3D 场景 函数 子弹 学习 Unity 调用 加载


1.准备C#的开发环境 VS2015, Unity3D 5.5.1

2.准备通信协议 protobuf 3.3.0 

具体请参考:​​Protobuf 3.3 使用总结​​

3.引入日志系统 :​​C#日志系统 Log4net使用总结​​

4.搭建并调通和server之间的通信框架,通过反射注入到各个Action去处理,达到了命令行级别的通信

5.熟悉 Unity3d目录结构

4.NGUI 基础准备,下载NGUI版本,用的是 3.9.0b,熟悉NGUI的一些基本使用

4.1 通过各种对比,改成用原生的UGUI,​​选择NGUI还是uGUI​

5.了解 ​​Unity 3D游戏客户端基础框架​​ ,特别是Advanced CSharp Messenger

6.pureMVC的熟悉 http://puremvc.org/docs/PureMVC_IIBP_Chinese.pdf


//TODO


教学

​http://www.taikr.com/my/course/34​

nuget相关

nuget的配置文件:

%appdata%\NuGet

快捷键:

CTRL+D 复制组件

Unity直播课程:使用虚拟相机和Timeline配合制作机位切换(5/19录播)

CTRL+D 复制组件

CTRL+6 打开UI的动画设置面板

CTRL+N 创建新的场景scene

CTRL+SHIFT+F 选中main camera,让Game视角和scene视角一致

比较tag用Unity gameObject.CompareTag替换gameObject.tag,性能要好

枚举类的ID值获取:

type.GetHashCode()

Unity3D 的OnTriggerEnter和OnCollisionEnter方法

如果gameobject已经销毁,那么是无法触发invoke 或者协程

所以如下的操作能让invoke无效:

Destroy(this.gameObject); CancelInvoke("回调函数");

MonoBehaviour的生命周期,awake->onEnable->start

结论

Awake

Start

OnEnable

OnDisable

OnDestroy

调用时机

物体实例化时(无论该脚本是否enable)

场景中所有对象的Awake执行完后

物体实例化时(该脚本需enable)

或物体被激活时

或该脚本被激活时

物体被取消激活时

或该脚本被取消激活时

该物体被销毁时

(生命周期内的)调用次数

一次

一次

被激活的次数

被取消激活的次数

一次

(一般性的)调用顺序

总是最先

OnEnable之后

Awake之后

---

---

注意事项

1.在Start里进行初始化并不很安全,因为它可能会被其他自定义函数抢先,容易引发空引用之类的问题。具体可参考博主puppet_master的​​相关测试​​中,“对象初始化的时机”中的第三点。
2.当场景中的多个物体都要调用Awake函数时,各个Awake函数之间的调用顺序无法确定。

Unity--Monobehavior九大生命周期

1. Awake 函数 :

在加载场景时运行 , 即在游戏开始之前初始化变量或者游戏状态 . 只执行一次

2. OnEnable 函数 :

在激活当前脚本时调用 , 每激活一次就调用一次该方法

3. Start 函数 :

在第一次启动时执行 , 用于游戏对象的初始化 , 在Awake 函数之后执行,只执行一次

4. Fixed Update : 固定频率调用 , 与硬件无关, 可以在 Edit -> Project Setting -> Time -> Fixed Time Step 修改

5. Update : 几乎每一帧都在调用 , 取决于你的电脑硬件 , 不稳定

6. LateUpdate : 在Update函数之后调用 , 一般用作摄像机跟随

7. OnGUI 函数 : 调用速度是上面的两倍 , 一般用于老版本的 GUI 显示

8. OnDisable 函数 : 和 OnEnable 函数成对出现 , 只要从激活状态变为取消激活状态 , 就会执行一次 (和 OnEnable互斥)

9. OnDestroy 函数 : 当前游戏对象或游戏组件被销毁时执行

InitializeOnLoad

[InitializeOnLoad]的且有static构造函数的类会在打开项目时就运行,可以用于编辑器的一些初始化工作。

using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public class GameContext
{
static GameContext()
{
Debug.Log("GameContext start");
}
}

Unity3D学习之路_初始化

Unity添加注释,在Inspector面板显示提示

Tooltip("显示注释")]//鼠标移到变量上后可以看到汉字

[Header("显示注释")]//直接在面板上显示汉字

===============================

后台装载线程优先级

让您控制需要多长时间来异步加载数据,在后台在加载时游戏,对性能的影响

Application.backgroundLoadingPriority = ThreadPriority.High

装载尽可能多的数据,因此帧率将下降。

加载时显示出良好的快速进度条。

Application.backgroundLoadingPriority = ThreadPriority.Low ;

加载数据速度非常慢,尽量不影响游戏性能的。

在游戏进行时有很好的后台加载。

============================

现在要开发一个点击屏幕开炮发射子弹的功能,说下你的做法?
首先把子弹进行抽象,把属性和行为方法提炼出来,比如具有速度、威力、碰撞大小等属性,具有飞行、碰撞和伤害等行为。
封装子弹的抽象类,可以不继承MonoBehaviour。
监听屏幕点击事件,触发开炮逻辑。子弹通过对象池管理,复用子弹,防止因为频繁创建销毁带来的性能问题。另外,子弹的坐标更新,可以统一由一个弹道控制器的Update遍历每个子弹对象来计算,而不是每个子弹都挂一个MonoBehaviour去更新,因为MonoBehaviour的Update是通过反射被调用的,如果有1000颗子弹,就会调用1000次反射,这样性能上比较差。

延伸
如果现在要做好几种弹道的子弹,可以继承子弹基类,拓展出多种子弹子类,子类中各自实现自己的UpdatePosition接口,弹道管理器通过Update遍历每个子弹调用基类的UpdatePosition接口。

============================

 只要判断子弹和目标的距离小于一定的范围就算击中了

Physics.CheckSphere(); //检查给定范围内有没有指定碰撞体。

Physics.OverlapSphere(); //得到指定范围内所有碰撞体。

Vector3.Dot(); //点乘。

Physics.IgnoreCollision(); //忽略指定碰撞层。

==============================

现在Unity对场景管理没有那么严格的分离, 同时可以存在多个场景

可以存在一个主场景, 然后叠加几个 子场景, 不过这些场景都是要加载的, 包括第一个场景, 只不过第一个场景Unity帮你加载了

然后下面那个场景是比较特殊的场景, 那个场景不需要额外加载
那个场景是用来存放一类特殊的GameObject ,他们都有个属性, 不随场景卸载而卸载

如果有这种 GameObject , Unity会自动创建这么个场景, 这个场景的生命周期一直到游戏关闭, 都不会卸载

所以这里的 GameObject 处理要格外当心

==============================

函数式 传参

this.HandleBorn(CreatePlayer,"a",1, e.BornPoint);


private void HandleBorn(System.Action<string,int,Vector2> callback,string userName, int playerTemplateID, Vector2 pos)
{
GameObject go = ResourceManager.Instance.LoadAssetSync<GameObject>("Entity/effects/BornEffect").InstantiateSync();
go.transform.position = pos;
BornEffect effect= go.GetComponent<BornEffect>();
effect.Callback = callback;
effect.Pos = pos;
effect.UserName = userName;
effect.PlayerTemplateID = playerTemplateID;
Object.Destroy(go, 1f);
}


public class BornEffect : MonoBehaviour
{
public string UserName{ set; get; }

public int PlayerTemplateID{ set; get; }
public Vector2 Pos{ set; get; }

public Action<string,int,Vector2> Callback{ set; get; }



private void OnDestroy()
{
Callback.Invoke(UserName,PlayerTemplateID,Pos);
}
}

标签:Unity3D,场景,函数,子弹,学习,Unity,调用,加载
From: https://blog.51cto.com/u_4176761/5973436

相关文章

  • Python学习笔记--PySpark的基础学习(二)
    filter方法(过滤想要的数据进行保留)具体实现(保留奇数):具体实现(保留偶数):distinct方法(对RDD进行去重,返回新的RDD)且无需传参具体实现(去重):sortBy方法(排序,基于我们制定的......
  • iOS学习笔记45—本地通知UILocalNotification
    在iOS中有两类信息提示推送方式,一类是远程服务器推送(APNS),之前有笔记9​​,还有一类就是本地通知UILocalNotification,今天就简要的记录一下UILocalNotification的使用,代码里见......
  • 英语学习资料以及一首小诗 我学会坚强 英语诗
     本文作者三年间从四级勉强及格到高级口译笔试210,口试232。找工作面试时给其口试的老外考官听了一分钟就说你的英语不用考了。虽不敢说方法一定是最好的,但从现在开始随便谁......
  • 【iOS知识学习】_iOS开源项目汇总
    扫描wifi信息:​​http://code.google.com/p/uwecaugmentedrealityproject/​​​​http://code.google.com/p/iphone-wireless/​​条形码扫描:​​http://zbar.sourceforge.......
  • 前端·学习 | 模态框式的登录界面
    ​ 目录前言:特效展示实现代码:html部分:css部分:js部分:总结:前言:个人学习内容分享特效展示前端特效学习(二)实现代码:html部分:模态框形式的登录窗口<!D......
  • 第一期预告|基于深度学习的物体抓取位置估计
    3D视觉工坊的各位小伙伴们,本周我们将迎来首次线上公开课,此次公开课是一次知识分享,希望更多的小伙伴能够加入我们。本周给大家先带来一场关于机械臂抓取的精彩课程。本周公开......
  • Python学习经历
    列表索引for循环改内容大写s=["张无忌","武则天","刘备","abc","cba"]forlstinrange(len(s)):x=s[lst].upper()s[lst]=xprint(s)......
  • 生成函数 学习笔记
    定义:数列\(F\)的生成函数为\(F(x)=\sum_{i=0}F[i]x^i\),其中的\(x\)并没有实际意义几何级数定理\[\sum_{i=0}x^i={1\over1-x}\]证明考虑等比数列求和,由于\(......
  • markdown学习
    MarkDown学习二级标题(##+空格)三级标题(###+空格)字体 helloworld!(粗体字体两边分别加*(2个))helloworld(斜体是一个*号)helloworld(斜体加粗是3个*号)fenkexian列......
  • mybatis框架学习1——实现增删改查
    前言:这个文章的定位不是实现的步骤,而是实现过程中遇到的问题。并且我写的步骤是别人的步骤的记录,算不了什么,后面对使用过程中遇到的问题以及解决的方法才是自己写的,有价值的......