首先,最重要一点,编写代码时必须添加注释,即使是简洁的注释也是有用的。
在程序员的社区中,流传着一句名言:“现在我写的这段代码只有我和上帝能看懂,过了一星期只有上帝才能看懂,再过一星期连上帝也看不懂”。这句话并非言过其实,你可以回顾几周前你所写的代码,尝试立即解释它的功能。我确信99.999%的人都做不到这一点(除非你是那0.001%的超人)。编写具有注释的代码也需要花费时间来理解,更不用说没有注释的代码了。
注释并不要求对每一行代码进行逐字的解释,而是要重点突出核心功能,简要说明此代码段的功能、其编写原因和实现方式。如下所示:
// 在Update函数中检查目标游戏物体是否存在,如果存在,则让UI物体跟随其移动。
private void Update()
{
if (targetObject != null)
{
// 获取目标游戏物体的世界坐标
Vector3 targetPosition = targetObject.position;
// 将目标坐标从世界空间转换为Canvas空间
Vector3 canvasPosition = Camera.main.WorldToViewportPoint(targetPosition);
// 获取Canvas的Rect
RectTransform canvasRect = GetComponentInParent<Canvas>().GetComponent<RectTransform>();
// 将Canvas空间的坐标转换为UI物体的本地坐标
Vector2 screenPosition = new Vector2(
((canvasPosition.x * canvasRect.sizeDelta.x) - (canvasRect.sizeDelta.x * 0.5f)),
((canvasPosition.y * canvasRect.sizeDelta.y) - (canvasRect.sizeDelta.y * 0.5f))
);
// 更新UI物体的位置
uiRectTransform.anchoredPosition = screenPosition;
}
}
此外,还需注意命名规范,一定要使用英文命名,切勿使用拼音或汉字。这并非对拼音和汉字的贬低,但据我所见,几乎所有的程序员都采用英文命名方式。使用拼音不仅可能产生歧义(你能分清楚“qiang枪”和“qiang墙”吗),而且会给其他协作者带来不必要的麻烦。
至于中文命名,虽然大多数编程语言支持中文命名,但在编译运行或打包时可能会出现错误,你也不想在查找和修复错误方面浪费时间吧。
这里的英文命名并不是用字母a,b,c,d随意命名,而是要对应其作用,如下列代码:
//标准命名
public class Zombie : MonoBehaviour
{
protected Vector3 dir;
public Vector3 _dir = Vector3.left;
public Animator animator;
private Plant plant;
private SpriteRenderer zombieImg;
public int damageValue;//伤害值
public float speed;//速度
public int bloodVolume;//血量
public float attackInterval;//攻击间隔
protected float timer = 0;
protected int currentBlood;//当前血量
protected float _speed;
protected string target = "Plant";//攻击目标
protected bool isWalk=true;
protected bool isDie=false;
//...
}
//随意命名
public class Zombie : MonoBehaviour
{
protected Vector3 a;
public Vector3 b = Vector3.left;
public Animator c;
private Plant d;
private SpriteRenderer e;
public int f; // 伤害值
public float g; // 速度
public int h; // 血量
public float i; // 攻击间隔
protected float j = 0;
protected int k; // 当前血量
protected float l;
protected string m = "Plant"; // 攻击目标
protected bool n = true;
protected bool o = false;
// ...
}
随意命名即使写了注释也很难看懂。
个人推荐变量名采用小驼峰命名法(camelCase)或蛇形命名法(snake_case),函数名、类名、接口(interface)、枚举类型、结构体则使用大驼峰命名法(PascalCase)。
在命名时,如果发现名称过长,可以通过缩写单词来简化命名,但最好简化为大家熟知的单词。简化的单词在命名中的占比要尽量低,否则可能产生歧义。
例如:假设我们要表示 “coordinate”(坐标),但将其缩写为 “coord”。这个缩写是常见的,但也有其他词可能会以相似的方式进行缩写,例如 “coordinate” 和 “coordination” 都可以缩写为 “coord”。
// 坐标类
public class Coord { ... }
// 协调类
public class Coord { ... }
在这种情况下,“Coord” 可能会引起阅读者的混淆,不清楚是指坐标(coordinate)还是协调(coordination)。