using System; using Godot; public partial class ActivityMark { /// <summary> /// 根据预制表达式创建物体并返回 /// </summary> /// <param name="type">物体类型</param> /// <param name="expressionFieldName">预制表达式字段名称, 注意是字段名称, 而不是内容</param> public ActivityObjectResult<T> CreateActivityObjectFromExpression<T>(ActivityType type, string expressionFieldName) where T : ActivityObject { if (_currentExpression.TryGetValue(expressionFieldName, out var expressionData)) { if (expressionData.Id == "null") { return null; } var id = ActivityId.GetIdPrefix(type) + expressionData.Id; var activityObject = ActivityObject.Create<T>(id); if (activityObject == null) { return null; } HandlerExpressionArgs(type, activityObject, expressionData); return new ActivityObjectResult<T>(activityObject, expressionData); } GD.PrintErr("未找到表达式字段: " + expressionFieldName + ", 请检查是否有该字段或者该字段加上了[ActivityExpression]标记"); return null; } private void HandlerExpressionArgs(ActivityType type, ActivityObject instance, ActivityExpressionData expressionData) { switch (type) { case ActivityType.None: break; case ActivityType.Player: break; case ActivityType.Test: break; case ActivityType.Role: break; case ActivityType.Enemy: break; case ActivityType.Weapon: { var weapon = (Weapon)instance; //当前弹夹弹药量 if (expressionData.Args.TryGetValue("CurrAmmon", out var currAmmon)) { weapon.SetCurrAmmo(int.Parse(currAmmon)); } //备用弹药量 if (expressionData.Args.TryGetValue("ResidueAmmo", out var residueAmmo)) { weapon.SetResidueAmmo(int.Parse(residueAmmo)); } } break; case ActivityType.Bullet: break; case ActivityType.Shell: break; case ActivityType.Other: break; } } }