MAC环境搭建

ooowl
  • 游戏开发
  • dotnet
  • unity
About 5 min

📝Note

这是我为自己做的选择。
白鸟白鸟不要回头望
你要替我飞去那地方
一去那地方
那是你我共同故乡

No Game,No Life

已经习惯了使用mac和jetbrains全家桶开发,这次换了新电脑也继续用吧,开箱即用不用操心真不错。
基本的开发环境dotnet,git之类的都跳过了,这些太基础

摆脱中国特供版Unity

首先代理是必须的
中国特供版会让你填手机号,不要访问unity.cnopen in new window,也不要访问unity.com的中文版面,要访问英文界面的官网。
然后注册你的unity帐号,找个镜像之类的下载unity hub国外的版本,不是中国特供版,不然会让你跳到国内版网站去验证。
如果有已安装的UnityHub版本,先卸载,为以防万一,卸载之后删除 ~/AppData/Roaming 这个目录下的UnityHub和Unity Hub目录。然后再安装,mac直接删除UnityHub就行

windows上的启动脚本为

@echo off
set HTTP_PROXY=http://127.0.0.1:1080
set HTTPS_PROXY=http://127.0.0.1:1080
start "" "C:\Program Files\Unity Hub\Unity Hub.exe"

mac的为

#!/bin/bash
export HTTP_PROXY=http://127.0.0.1:1080
export HTTPS_PROXY=http://127.0.0.1:1080
nohup "/Applications/Unity Hub.app/Contents/MacOS/Unity Hub" &>/dev/null &

原理就是先在命令行里走代理,然后启动程序就会全走命令行的代理,打开之后是不能关掉命令行的session的。
如果是程序老手,平时肯定就已经挂上了,直接使用最后一句启动就行
一定要使用上面的脚本启动!否则UnityHub启动时不会读取系统代理,在登陆时会跳转到https://id.unity.cn/open in new window

设置Rider为编辑器

能够在 Unity 中双击实现在 Rider 中打开文件,在 Rider 中调试项目(简单点说就是 Rider 代替 Visual Stdio)

  1. 打开Unity项目选择:Window > Package Manager > 搜索 Rider 点击 Install(安装)
  2. 安装完毕后,选择 Edit > Preferences > External Tools > 选择 External Scriot Editor 为你的Rider版本
  3. 若在你的 Package Manager 窗口中搜索不到 JetBrains Rider Editor,那么请检查 Packages 是否选择了 Unity Registry,选择 In Project就是在你自己的工程里搜索,如果你没有安装的话是搜不到的

Warning

不要直接浏览选择Rider
这里有坑, External Scriot Editor 的时候千万不要从你的文件目录里面选择你安装的 Rider.exe,如果不修改这个地方就一直不能把 Unity 和 Rider 联系起来!!
因为这个版本的 Unity 本身自带了 Rider 工具,如果不修改这个地方就一直不能把 Unity 和 Rider 联系起来!! 因为这个版本的 Unity 本身自带了 Rider 工具,官网有文章open in new window

之后双击就是在Rider中打开项目了。

C#的特点

  • 没有多重继承
  • 提供了GC和内存管理
  • 编译为中间代语言CIL,使用.NetFramwork虚拟机CLR Common Language Runtime通用语言运行库执行
  • 沙币微软dotNet早期不开源,只能在windows运行,所以unity用mono把CIL直接用JIT编译成汇编运行
  • Mono是微软.Netopen in new window Framework的开源实现,基于C#语言的ECMA标准,包含C#编译器和CLR
  • 最开始不是开源的,但是后来开源了,dotnet库非常非常大,包是内部提供的,而不是由开源社区托管

📌Tip

** 复习一下概念**
当前运行环境本地指令的提前编译(AOT)或即时编译(JIT),Mono会有一部分代码通过AOT静态编译,以降低在程序运行时JIT动态编译在效率上的问题。
在iOS平台中Mono无法使用JIT引擎,而是以Full AOT模式运行的,所以此处说的即时编译不包括IOS,这也是U3D官方没有提供热更新的原因
Ahead of Time AOT编译在应用程序执行前进行,并且通常在不同计算机上(需要运行的平台)执行,用于转换成对应平台的指令。

iOS平台是禁止使用JIT的,可Mono的AOT模式仍然会保留一部分代码会在程序运行时动态编译。

为了破解这个问题,Mono提供了一个被称为Full AOT的模式。即预先对程序集中的所有CIL代码进行AOT编译生成一个本地代码映像,然后在运行时直接加载这个映像而不再使用JIT引擎。

iOS无法dll热更新的根本原因

实际上,iOS并非直接把JIT禁止了,而是IOS封了JIT内存(或者堆)的可执行权限,相当于变相的封锁了JIT这种编译方式。[1]

DOTNET不是编程语言,但它能通过CLR(公共语言运行库)的JIT编译器CIL(公共中间语言)编译成本机代码本机代码包括托管代码非托管代码

  • 托管代码:为DOTNET框架编写的代码,需要CLR。
  • 非托管代码:是指直接编译成目标计算机的机器码,比如Win32 C/C++ DLL。不在CLR控制下以运行。 本机代码可以在操作系统上执行,在执行的过程中CLR(公共语言运行库)会对托管代码进行内存管理、垃圾收集和异常处理等管理。并不是编译完就没事了 IL2CPP是解决苹果不能跨平台的方案,比mono快,将IL代码转为C++然后重新编译成原生汇编 #todo
using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;  
  
public class demo : MonoBehaviour  
{  
    // Start is called before the first frame update  
    void Start()  
    {        
        Debug.Log("hello world");  
    }  
    // Update is called once per frame  
    void Update()  
    {            }  
}

在unity中最基本的对象是MonoBehaviour,很多的unity类都基于这个类
MonoBehaviour提供了很多生命周期方法,好好使用。
类名必须要和脚本文件的名称相同,这样才能挂载到unity的对象上


  1. 为什么iOS无法动态加载Dll? | 车斌的博客open in new window ↩︎

Loading...