一、命名约定
-
命名变量、属性、函数参数时,使用驼峰式大小写(“camelCasing”)。
-
命名类名、函数名时,使用帕斯卡拼写法(“PascalCasing”)。
-
命名常量时,使用全部大写写法(“ALLUPPER”)。
-
命名任何标识符都不使用拼音,标识符命名具有可阅读性,一些迭代变量可以使用当个字母,如i,j等等。
示例:
public class RiderController : MonoBehaviour
{
private const float INITIALSPEED = 10f; // 初始移动速度
private const float SKILLCD = 30f; // 技能CD
private const float DISGUISECD = 5f; // 伪装的CD
float horizontalMove; // 水平移动
float verticalMove; // 垂直移动
public float speed; // 移动速度
public NetworkAnimator networkAnimator; // 网络动画
public GameObject fakeBody; // 假身的预制体
public float skillStartTime; // 技能释放的初始时间
public float disguiseStartTime; // 进行伪装的初始时间
public Sprite[] pic; // 假声可以替换的图片资源
public SpriteRenderer spriteRenderer; // 假身进行替换图片的组件
// Start is called before the first frame update
void Start()
{
speed = INITIALSPEED;
sr = GetComponent<SpriteRenderer>();
skillStartTime = -SKILLCD;
disguiseStartTime = -DISGUISECD;
}
}
二、布局约定
好的布局利用格式设置来强调代码的结构并使代码更便于阅读。 我们的布局示例和样本需符合以下约定:
-
使用默认的代码编辑器设置(智能缩进、4 字符缩进、制表符保存为空格)。
-
每行只写一条语句。
-
每行只写一个声明。
-
当一个语句块位于另一个语句块的内部,它的缩进要在外部语句块基础上再缩进一个制表符(4个空格)。
-
在方法定义与属性定义之间添加至少一个空白行。
示例:
horizontalMove = Input.GetAxis("Horizontal");
verticalMove = Input.GetAxis("Vertical");
if (horizontalMove != 0 || verticalMove != 0)
{
transform.Translate(new Vector3(horizontalMove, verticalMove, 0f) * speed * Time.deltaTime);
if (horizontalMove < 0)
{
networkAnimator.SetBool("left", true);
}
else if (horizontalMove > 0)
{
networkAnimator.SetBool("left", false);
}
else
{
// 不进行操作
}
}
三、注释约定
- 变量注释放在代码行的末尾,注释内容为变量作用或者名称,要具有可描述性。
- 其他注释放在单独的行上,而非代码行的末尾。
- 在注释分隔符 (//) 与注释文本之间插入一个空格。
- 使用框架时,本身带有的注释不需要进行任何改变,即使它是英文。
- 在每个文件的开头加上代码注释,注释内容为这个文件的功能职责。
示例:
public class DragonController : MonoBehaviour
{
private const float INITIALSPEED = 10f; // 初始移动速度
private const float MAXTIME = 5f; // 冲刺技能持续时间
private const float DASHSPEED = 2f * INITIALSPEED; // 冲刺速度
public NetworkAnimator animator; // 网络动画同步组件
public float speed; // 正常速度
public float dashTime; // 冲刺时间
public bool canDash; // 是否可以冲刺
// Start is called before the first frame update
private void Start()
{
// 设置移动速度
speed = INITIALSPEED;
// 设置冲刺时间
dashTime = 0f;
// 设置是否可以冲刺
canDash = false;
}
}
四、变量约定
- 一般不使用全局变量,毕竟使用全局变量会增加代码的阅读困难。
- 代码中不出现具体的数值,变量的初始化数值统一放在一个接口文件,设置为静态常量,这样统一管理游戏参数,方便后期游戏的测试和维护。
- 每一个变量后面必须增加注释,注释内容为该变量的名称或者作用,要具有可描述性。
// 角色标号
// 猎人
public const int rabbitIndex = 0;
public const int dragonIndex = 1;
public const int smallWhiteIndex = 2;
// 猎物
public const int grassIndex = 3;
public const int archerIndex = 4;
public const int fisherIndex = 5;
public const int riderIndex = 6;
public const int mageIndex = 7;
public const int godIndex = 8;
//------------------------------------------------------------------------------------------------------
// 角色速度
public const float hunterSpeed = 12f;
public const float preySpeed = 10f;
public const float allSpeedUp = 18f;
public const float singleSpeedUp = 20f;
//------------------------------------------------------------------------------------------------------
// 子弹速度
public const float bullet = 30f;
//------------------------------------------------------------------------------------------------------
// debuff持续时间
public const float stopTime = 2f;
public const float stopSpeed = 0f;
//------------------------------------------------------------------------------------------------------
// tag
public const string preyTag = "Prey";
public const string fakeBodyTag = "fakeBody";
//------------------------------------------------------------------------------------------------------
// 技能CD
public const float disguiseCD = 15f; // 猎物伪装CD
public const float shootCD = 5f; // 猎人发射子弹CD
// 猎人
public const float rabbitECD = 30f; // 兔子E技能CD
public const float dragonECD = 20f; // 龙E技能CD
public const float smallWhiteECD = 15f; // 小白E技能CD
// 猎物
public const float grassECD = 20f; // 草E技能CD
public const float archerECD = 15f; // 弓箭手E技能CD
public const float fisherECD = 90f; // 鬼影迷踪E技能CD
public const float riderECD = 30f; // 骑士E技能CD
public const float mageECD = 120f; // 魔法师E技能CD(传送)
public const float godECD = 45f; // 上帝E技能CD(上帝视角)
五、函数约定
- 函数与函数之间至少有一个空白行
- 一个函数只完成一个任务。
- 函数命名一般以动词开头,命名约定为帕斯卡拼写法(“PascalCasing”)。
- 函数的花括号位于函数的下方且单独占一行。
- 如果if、while、for等等语句块的内容只有一行,也必须要加花括号,且花括号开头位于语句的下方开始,而不是语句的末尾。
- 返回bool类型的方法、属性的命名,如果方法返回的类型是bool类型,则其前缀为Is,例如:IsHidden;如果某个属性的类型为bool类型,则其前缀为can,例如:canHidden。
示例:
// 冲刺
void Dash()
{
if (canDash)
{
float dashTimeLeft = Time.time - dashTime;
// 判断冲刺持续时间是否大于冲刺技能持续时间,如果是,则结束冲刺。
if (dashTimeLeft > MAXTIME)
{
canDash = false;
speed = 10f;
}
else
{
speed = DASHSPEED;
}
}
}