[Unity 代码写法整理]嵌套判断问题(二)

博客讨论了嵌套判断的优化方法。介绍了无需条件判断、以多数服从少数的实现方式,将实现和调用函数分离,摆脱条件判断对代码可读性的影响。还提及多层嵌套判断是降阶问题,可将维度降至一维,并给出用逻辑运算符细化条件、封装条件成对象等降维方法。

4.前面三种都是需要if else switch case去判断的,现在写一种不需要条件判断的。思想是以多数服从少数,多数包含少数的实现,少数调用。文字上难以理解,直接上代码比较好。还是防具和武器播放不同动画的栗子,这里假如武器种类多,防具数目比较少,也就是武器是多数,防具是少数

public class ArmorBase
{
    public virtual void PlayAnimation()
    {
        //for override
    }
}

public interface IWeapon
{
    void PlayLeatherAnimation();
    void PlayChainAnimation();
    void PlayPlateAnimation();
}

//装备系统,作为一个单例,
public class EquipmentSystem : Singleton<EquipmentSystem>
{
    private IWeapon currentWeapon;
    private ArmorBase currentArmor;

    public void SetWeapon(IWeapon weapon)
    {
        currentWeapon = weapon;
    }

    public void SetArmor(ArmorBase armor)
    {
        currentArmor = armor;
    }

    public void PlayAnimation()
    {
        currentArmor.PlayAnimation();
    }
}

//只写Leather,Chain和Plate同理
public class Leather : ArmorBase
{
    public override void PlayAnimation()
    {
        EquipmentSystem.Instance.currentWeapon.PlayLeatherAnimation();
    }
}

//只写个Sword,其他武器同理
public class Sword : IWeapon
{
    public void PlayLeatherAnimation()
    {
        //拿剑穿皮甲的动画
    }

    public void PlayChainAnimation()
    {
        //拿剑穿锁甲的动画
    }

    public void PlayPlateAnimation()
    {
        //拿剑穿板甲的动画
    }
}

int Main()
{
    EquipmentSystem.Instance.SetWeapon(new Sword());
    EquipmentSystem.Instance.SetArmor(new Leather());
    EquipmentSystem.Instance.PlayAnimation();
}

其实这个跟第一种方法还是有点像的,只不过武器类一个函数转化为三个函数,不过还是有区别的。第一种方法实现和调用是同一个函数,而这种方式,实现和调用的函数分离开来,而且摆脱了条件判断对代码可读性的影响,更加容易定位出现的问题。

==============================

5.如果嵌套判断不止两层,有多层怎么办。其实这个问题就跟拧魔方一样,是一个降阶问题。最理想的情况,是要将嵌套判断的维度下降到一维。

if(X1)
{
    if(Y1)
    {
        if(Z1)
        {

        }
    }
}

这种判断如果多了,会很痛苦。

if(X1 && Y1 && Z1)
{
    
}

这样就将三维的判断降低到一维。

==============================

6.嵌套判断降低维度的一些方法

一种是用&&和||去细化判断条件,不过判断条件越多就越长越乱。更合理的办法是通过将判断条件封装成对象,然后写一个Utils类或者重写运算符的方式,把判断的条件创建一个模板对象。栗子如下:

public class StudentConditionClass
{
    public int age;
    public float height;
    
    public StudentConditionClass(int ageArg,float heightArg)

    //重载运算符
    public static bool operator ==(StudentConditionClass studen1, StudentConditionClass student2)
    {
        return student1.age == student2.age && student1.height == student2.height;
    }   

    //重载运算符
    public static bool operator !=(StudentConditionClass studen1, StudentConditionClass student2)
    {
        return !(student1.age == student2.age && student1.height == student2.height);
    }  
}

public class JudgeUtils
{
    //写一个Utils类去判断
    public static bool IsStudentEqual(StudentConditionClass studen1,StudentConditionClass student2)
    {
        return student1.age == student2.age && student1.height == student2.height;
    }
}

int Main()
{
    StudentConditionClass student = new StudentConditionClass(18,183.1f);
    //判断模板1
    StudentConditionClass studentTemplete1 = new StudentConditionClass(18,183.1f);
    //判断模板2
    StudentConditionClass studentTemplete2 = new StudentConditionClass(19,190f);

    //重载运算符判断
    if(student == studentTemplete1)
    {
        //XXX
    }
    //Utils判断
    else if(JudgeUtils.IsStudentEqual(studen,studentTemplete2))
    {
        //XXX
    }
}

这样的话判断条件会简化,也更易读。不过会有多余内存占用,毕竟每一个用于判断的模板也是对象。所以最终使用的时候还是要根据情况选择最优的方法判断。

==============================

OK嵌套判断的理解就告一段落了,欢迎讨论。下一周开始写一些跟设计模式有关的代码写法了~

<think>好的,我现在要解决用户的问题:在Unity中动态设置Text组件的富文本换行时,使用\n或<br>无效。用户提到了参考的引用内容,我需要结合这些引用和Unity的知识来找到解决方案。 首先,用户提供的引用中,引用[2]和引用[3]提到在普通Text组件中使用\n可以实现换行。例如,在代码中直接给text.text赋值时,使用\n,如"第一行\n第行"。这说明在非富文本模式下,\n是有效的。但问题出现在启用富文本的情况下,用户发现\n或<br>不起作用。 接下来,我需要回忆Unity的Text组件关于富文本的处理。当启用富文本时,Text组件会解析HTML标签,比如<b>、<i>等。但是换行标签可能有所不同。通常HTML中使用<br>作为换行标签,但在Unity中可能不支持这个标签,尤其是在Text组件中。可能Unity的富文本解析器并不支持所有标准的HTML标签,或者有特定的处理方式。 根据用户的问题,尝试使用\n或<br>无效,可能是因为在富文本模式下,\n被忽略了,而Unity的Text组件并不支持<br>标签。这时候可能需要寻找其他方法来实现换行。 查看引用[2]中的代码示例,当使用Text组件时,\n确实有效,但这是在未启用富文本的情况下。当启用富文本后,可能解析方式改变,导致\n不再被识别。这时候可能需要使用其他方式,比如在富文本中插入Unicode的换行符,或者结合其他标签。 另外,考虑到Unity的Text组件在富文本模式下可能会处理空格和换行符的方式不同,可能需要使用Unicode的换行符,比如\u2028(行分隔符)或者\u000A(换行符的Unicode表示)。不过,通常\n在C#字符串中会被转义为换行符,但在富文本中可能被忽略。 另一种可能性是,在富文本中,换行符需要结合其他标签一起使用,比如在文本中插入<line-height>或者其他布局相关的标签,但这可能不太直接。 或者,用户可能需要手动在字符串中插入换行符,即使在富文本模式下,但需要确保在设置文本时,换行符被正确解析。例如,可能需要使用Environment.NewLine来代替\n,但根据引用中的例子,用户已经尝试过\n,可能环境不同。 查阅Unity的官方文档,关于富文本的支持标签,发现Unity的富文本支持有限的标签,如大小、颜色、加粗等,但不支持<br>标签。因此,当启用富文本时,原有的\n可能被忽略,而需要寻找替代方法。 可能的解决方案是,在富文本模式下,仍然使用\n,但需要确保在代码中正确插入换行符。或者,使用Unicode的换行符,如\u000A,或者使用其他方式,比如在文本中插入空格和自动换行,但这可能不适用于动态内容。 或者,用户可能需要关闭富文本功能,如果换行是关键需求,而其他富文本样式不是必须的。但用户可能同时需要富文本样式和换行,所以需要找到兼容的方法。 另外,引用[1]提到不同空格符号的换行行为,可能换行符的处理也受到文本组件设置的影响,比如是否启用自动换行等。但用户的问题是关于动态设置文本时的换行符,而非自动换行。 综合以上分析,可能的解决方案是:在富文本模式下,Unity的Text组件仍然识别\n作为换行符,但需要确保在设置文本时,换行符没有被富文本标签干扰。例如,在拼接富文本内容时,正确插入\n。例如: text.text = "<color=red>第一行</color>\n<color=blue>第行</color>"; 如果这样仍然不换行,可能需要检查是否启用了富文本。或者,可能需要使用\\n来表示换行,但在C#中,这会被转义为\n,所以不太可能。 另一种可能性是,在富文本中,换行符需要被包裹在正确的标签内,或者需要调整文本组件的设置,比如支持多行等。 根据经验,可能的问题在于启用富文本后,换行符的处理方式不同,需要改用Unicode换行符。例如,使用"\u000A"代替\n。因为在某些情况下,当启用富文本解析时,\n可能被当作普通空格处理,而使用Unicode换行符可能有效。 例如: text.text = "第一行<color=red>红色文本</color>\u000A第行"; 或者,可能需要使用Environment.NewLine,在Windows下是"\r\n",在Unity中可能兼容。例如: text.text = "第一行" + Environment.NewLine + "第行"; 但需要测试是否在富文本模式下有效。 如果以上方法都不奏效,可能需要通过其他方式实现换行,例如将文本分割为多个部分,并分别应用富文本样式,然后组合成带有换行的字符串。 或者,使用Text组件的支持多行的属性,确保文本框足够宽以允许自动换行,但这可能不适用于精确控制换行位置的情况。 总结可能的解决方案: 1. 在富文本字符串中直接使用\n,确保没有被其他标签打断。 2. 使用Unicode换行符\u000A或\u2028。 3. 使用Environment.NewLine。 4. 检查是否启用了富文本功能,可能需要调整其他设置。 5. 如果以上无效,可能需要手动处理文本,分段落应用富文本。 根据用户提供的引用,引用[2]中的代码使用\n在普通Text组件中有效,但在富文本模式下可能需要不同的处理。因此,正确的解决方法可能是使用Unicode换行符或者在代码中正确插入换行符,同时确保富文本标签的正确闭合。 例如,正确的代码可能是: text.text = "富文本第一行\n<color=red>第行</color>"; 或者: text.text = "富文本第一行\u000A<color=red>第行</color>"; 或者,检查Text组件的设置,如是否勾选了“Multi-line”选项,或者文本框的尺寸是否足够显示多行。 此外,可能需要确认在富文本模式下是否支持换行符,有些情况下可能需要结合其他标签。例如,在Unity的TextMeshPro中,换行处理可能不同,但用户的问题是关于普通的Text组件。 最后,可能的解决方案是:在启用富文本的情况下,使用\n换行符仍然有效,但需要确保在代码中正确使用,并且没有其他标签导致换行符被忽略。例如: text.text = "<b>标题</b>\n内容"; 如果这样仍然不换行,可能需要使用\u000A代替\n,或者检查是否存在其他问题,如字体设置、文本框大小等。</think>在Unity中动态设置Text组件的富文本换行时,若使用`\n`或`<br>`无效,需结合富文本特性调整实现方式。以下是具体解决方案: ### 解决方案步骤 1. **确认富文本模式启用** 在Inspector面板中勾选Text组件的**Rich Text**选项,否则富文本标签和换行符可能无法解析[^2]。 2. **使用`\n`换行符的正确姿势** 在富文本字符串中,直接插入`\n`即可实现换行,但需确保换行符**未被富文本标签截断**。 示例: ```csharp text.text = "<color=red>第一行</color>\n<color=blue>第行</color>"; ``` 3. **尝试Unicode换行符** 若`\n`仍无效,可使用Unicode换行符`\u000A`或`\u2028`(行分隔符)。 示例: ```csharp text.text = "第一行\u000A<size=20>第行</size>"; ``` 4. **避免标签嵌套干扰** 确保富文本标签闭合正确,避免未闭合的标签影响后续内容解析。例如: ```csharp // 正确写法 text.text = "<b>标题</b>\n正文内容"; // 错误写法(标签未闭合) text.text = "<b>标题\n正文内容</b>"; ``` 5. **结合Text组件的自动换行** 若需动态内容自适应换行,可设置Text组件的**Horizontal Overflow**为`Wrap`,并限制文本框宽度: ```csharp text.rectTransform.sizeDelta = new Vector2(200, 0); // 限制宽度为200像素 ``` ### 代码示例 ```csharp using UnityEngine; using UnityEngine.UI; public class RichTextNewLine : MonoBehaviour { public Text textComponent; void Start() { // 使用\n换行 textComponent.text = "<color=#FF0000>动态富文本第一行</color>\n<color=#00FF00>第行</color>"; // 或使用Unicode换行符 // textComponent.text = "第一行\u000A<size=30>第行</size>"; } } ``` ### 关键逻辑说明 - **富文本解析机制**:Unity的Text组件在启用富文本后,会优先解析HTML样式标签(如`<color>`),但`\n`仍作为换行符处理[^2]。 - **换行符优先级**:若富文本标签导致`\n`失效,改用Unicode换行符可绕过解析冲突。 - **布局约束**:确保Text组件的RectTransform尺寸允许换行,避免内容被截断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值