103
社区成员
发帖
与我相关
我的任务
分享| 这个作业属于哪个课程 | 2501_CS_SE_FZU |
|---|---|
| 这个作业要求在哪里 | [ 团队作业—Beta冲刺]https://bbs.csdn.net/topics/620025444 |
| 这个作业的目标 | 代码规范 |
| 其他参考文献 | 《构建之法》、Google Style Guides |
\n。using 顺序:System.* → 第三方 → UnityEngine → UnityEngine.UI → 其他。I(保留现有 SM_ 系列)。[SerializeField] private;常量 PascalCase 或 UPPER_SNAKE。is/has/can/should 开头;事件:OnXxx。<summary> 简述用途。TODO: / NOTE:,注明清理条件。Awake:缓存组件、空引用防护、生成默认资源(材质/Mesh)。Start:外部依赖校验、默认值填充、事件订阅。Update:输入、动画参数、非物理逻辑。FixedUpdate:物理、速度/力/碰撞决策。OnDestroy:解绑事件、销毁自建资源(Mesh/Material/VFX 实例)。OnRenderObject/Gizmos。[Header]/[Tooltip]/[Range]。OnValidate/Awake 用 Mathf.Clamp/Max 做范围保护。Debug.LogError 并禁用脚本或降级。Update 或输入封装模块;多人/手柄可扩展。CollisionDetectionMode2D.Continuous,冻结无用旋转轴。SM_IKnockbackable),避免直接改 Transform。Attribute 或 SM_IDamageable.ApplyDamage(SM_DamageInfo)。HasParameter 校验并缓存 hash;缺失时警告并回退默认参数名。ResetTrigger;布尔用于持续态,Trigger 用于瞬态。Time.timeScale/AudioListener.pause;淡入淡出用 CanvasGroup/Animator,使用 unscaledDeltaTime。OnDestroy 释放。Debug.Log/Warning/Error。showDebugInfo);诊断函数用 [ContextMenu] 并标“仅调试”。#if UNITY_EDITOR 包裹 Editor 相关 API。FindObjectOfType 作为长期方案。Library/, Logs/, UserSettings/ 等生成目录。UI_InventoryPanel, VFX_FireHit.using UnityEngine;
public class Firebolt : MonoBehaviour
{
[Header("Config")]
[SerializeField] private float speed = 8f;
[SerializeField] private float lifetime = 2.5f;
[SerializeField] private float damage = 12f;
[SerializeField] private SM_Element element = SM_Element.Fire;
[SerializeField] private LayerMask hitLayers;
[SerializeField] private GameObject hitVfxPrefab;
private Vector2 direction;
private float timer;
public void Launch(Vector2 dir)
{
direction = dir.normalized;
}
private void Update()
{
transform.position += (Vector3)(direction * speed * Time.deltaTime);
timer += Time.deltaTime;
if (timer >= lifetime) Destroy(gameObject);
}
private void OnTriggerEnter2D(Collider2D other)
{
if (((1 << other.gameObject.layer) & hitLayers.value) == 0) return;
var dmg = other.GetComponent<SM_IDamageable>();
if (dmg != null)
{
dmg.ApplyDamage(new SM_DamageInfo
{
Amount = damage,
Element = element,
IgnoreDefense = false,
CritChance = 0.1f,
CritMultiplier = 1.5f
});
}
PlayHitVfx(other.transform.position);
Destroy(gameObject);
}
private void PlayHitVfx(Vector3 pos)
{
if (hitVfxPrefab == null) return;
var vfx = Instantiate(hitVfxPrefab, pos, Quaternion.identity);
var main = vfx.GetComponent<ParticleSystem>()?.main;
Destroy(vfx, main.HasValue && main.Value.duration > 0 ? main.Value.duration + 0.5f : 2f);
}
}