本文介绍了一些关于C#的常见概念与常用语法。

C#脚本生命周期

  • Awake:初始化。
  • Enable:渲染启用时调用,初始化方法不能写在里面。
  • Start:第一次Enable后调用。
  • Update:每一帧调用一次。
  • LateUpdate:update执行完lateupdate就会执行。
  • FixedUpdate:类似定时器,定期执行,与机器性能帧数无关,仅和时间有关。默认0.02s。
  • UnDisable:非激活状态调用。
  • OnDestroy:销毁时调用。

Time

  • 上一帧到下一帧的游戏时间Time.deltaTime。

  • 时间缩放值Time.timeScale。

Application

  • 游戏数据文件夹路径(只读,加密压缩)Applicants.dataPath。

  • 持久化文件夹路径(可写)Applicants.persistentDataPath。

  • StreamingAssets文件夹路径(只读,不加密)Application.streamingAssetsPath。

  • 临时文件夹Application.temporaryCachePath。

  • 后台运行Application.runInBackground。

  • 打开url Application.OpenURL。

  • 退出游戏Application.Quit()。

场景

  • SceneManager.CreateScene()创建场景。

  • SceneManager.LoadScene(“场景名称(编号)”)加载场景;LoadSceneMode参数设置为Single时只加载当前场景,设置为Additive时叠加场景。

  • SceneManager.LoadSceneAsync()异步加载场景,当场景很大时加载速度较慢。

  • SceneManager.UnloadSceneAsync()卸载场景。

  • SceneManager.GetActiveScene()获取当前场景。

  • Scene.GetRootGameObjects()获取场景中的所有游戏物体。

异步

  • AsyncOperation作为异步加载场景SceneManager.LoadSceneAsync()的返回值,使用yield return返回一个协程IEnumerator,并使用StartCoroutine启动协程。

  • operation.progress可以查看加载进度,在UI制作时可以做进度条。

  • operation.allowSceneActivation可以控制场景是否跳转,设置为False不会自动跳转。

Transform

  • transform.position是世界坐标系里的位置。

  • transform.localPosition是相对父物体的位置。

  • transform.LookAt(点坐标)看向某个点。

  • transform.Rotate(轴, 旋转度数);transform.RotateAround(点,轴,旋转度数)。

  • transform.Translate()移动。

  • transform.parent.gameObject获取父物体。

  • transform.DetachChildren()解除所有子物体。

  • transform.GetChild(0)根据下标获取子物体;transform.Find(“子物体名称”)根据名称获得子物体。

  • SetParent()设置父物体。

键鼠操作

  • input.GetMouseButtonDown()按下鼠标;input.GetKeyDown(KeyCode)按下键盘。

  • input.GetMouseButton()按住鼠标;input.GetKey(KeyCode)按住键盘。

  • input.GetMouseButtonUP()松开鼠标;input.GetKeyUp(KeyCode)松开键盘。

触摸操作

判断触摸点数目使用Input.touchCount。判断触摸阶段,类似键鼠操作中的抬起按下,基于touch.phase。

if(Input.touchCount == 1) {
Touch touch = Input.touches[0];
switch(touch.phase) {
case TouchPhase.Began:
break;
case TouchPhase.Moved:
break;
case TouchPhase.Stationary:
break;
case TouchPhase.Ended:
break;
case TouchPhase.Cancled:
break;
}
}

// 开启多点触摸
Input.multiTouchEnabled = True;

if(Input.touchCount == 2) {
Touch touch0 = Input.touches[0];
Touch touch1 = Input.touches[1];
}

虚拟轴

  • Input.GetAxis(“Horizontal”)表示水平虚拟轴,由ad或者左右控制,或者摇杆。

  • Input.GetAxis(“Vertical”)表示垂直虚拟轴,由ws或者前后控制,或者摇杆。

  • CharacterController.SimpleMove(向量)会朝着向量方向移动,向量dir设置为Vector3(horizontal, 0, vertical),可以完成简单角色方向控制。

碰撞检测

  • OnCollisionEnter监听发生碰撞;OnCollisionStay监听碰撞持续中;OnCollisionExit监听碰撞结束。

  • Collision类里包含了碰撞的信息,可以用于查看碰撞物体名称等。

触发

  • OnTriggerEnter监听触发发生;OnCollisionStay监听触发持续中;OnCollisionExit监听触发结束。

  • 勾选是触发器选项后,不一样的地方在于,它不受物理影响,可以直接穿透而不会有碰撞体积,但同时可以检测到碰撞。


2024.8.29

很久没写,我决定重启我的blog,最近基本都在使用Unity和编写C#脚本,然后就是用Python搭模型调参数…