版本v0.1.5
项目文件夹
根目录:
Build各平台的打包文件WindowsmacOS.appWebGL
Assets:
Animations动画(.anim)以及控制器(.controller)AudioBGM背景音乐SE音效
DataScriptableObject数据文件Fonts字体Materials材质Models3D模型Prefabs预制体(Prefab)Scenes场景Scripts代码Settings设置Localization本地化相关
ShadersTextures图片素材UI
素材格式
- 图片:使用
.png,尺寸为4的倍数 - 音乐音效:使用
.ogg,响度归一化为 -18 LUFS
命名
【不提倡拼音命名】美术等需要交接的素材优先使用中文,其次英文
例:玩家1_身体.png
编程规范
参考:
本文未提到的情况,以上述参考资料为准
命名
-
不提倡缩写,尽量写英文全称
-
临时变量和函数参数使用驼峰拼写法:首字母小写,中间单词首字母大写
private void Function(int count) { string message = ""; count++; } -
class类名使用Pascal拼写法:首字母大写public class Enemy : MonoBehaviour -
public变量和属性使用Pascal拼写法public int Count; public float Speed { get; set; } -
protected和private变量使用驼峰拼写法和下划线_前缀private GameObject _gameObject; -
[SerializeField]变量使用驼峰拼写法,且写在一行内[SerializeField] private GameObject gameObject; -
bool变量以动词前缀:public bool IsDead = true; public bool HasMoney { get; } private bool _isMoving = false; -
事件命名使用动词:
public event Action OpeningDoor; public event Action DoorOpened; -
来自
xx的事件处理函数命名为XX_EventHappened()player = GetComponent<Player>(); player.HpChanged += Player_HpChanged; private void Player_HpChanged() { //Handle the event }
布局
-
以下情况用两个空行分隔:
- 变量定义和函数定义之间
- 类/接口之间
-
注释符号和文字间有一个空格:
// 注释 // Comment -
基础布局顺序(从上到下):
public[SerializeField]private
-
类(class)内部布局顺序(从上到下):
- 嵌套类、枚举
enum - 事件
event - 常量
readonly, const - 属性
- 字段
- Unity函数:
Awake, Start, Update等 - 其他函数
- 嵌套类、枚举
-
当函数的参数太多时,换行并对齐:(两种方式)
// 1.第二行开始对齐 void Function(int longArgumentName, int p1, int p2) { // Function } // 2.换行,统一缩进一个Tab(4空格) void Function( int longArgumentName, int p1, int p2) { // Function }
示例
- 考虑封装性,变量优先
private,不提倡使用public字段- 需要在Unity中设置时,在
private字段上使用[SerializeField] - 需要给其他类访问时,使用属性
- 需要在Unity中设置时,在
using System;
using UnityEngine;
public class Player : MonoBehaviour
{
// 枚举
public enum Type
{
Player,
Enemy
}
// 事件
public event Action HpChanged;
// 常量
private readonly int _maxHp = 5;
// 属性
public int Hp { get; private set; }
public Type UnitType { get; }
// 字段
[SerializeField] private Enemy enemy;
[SerializeField] private int startHp = 3;
private Vector3 _position;
private Animator _animator;
// 函数部分: 空两行
// Unity函数
private void Awake()
{
// Awake中初始化自身的状态
_position = transform.position;
_animator = GetComponent<Animator>();
}
private void Start()
{
// Start中访问其他类
// 订阅事件
_enemy.Died += Enemy_Died;
}
private void Update() {}
// 其他函数: public在前,private在后
public void Attack()
{
Debug.Log("AAAAttack!");
}
public void TakeDamage(int damage)
{
Debug.Log($"Ahh! HP - {damage}")
}
private void Enemy_Died()
{
Debug.Log("好耶!");
}
}