Untiy CurvedUI 的使用的bug修正

本文详细介绍了CurvedUI插件的使用方法及常见问题解决技巧,包括UI刷新问题和代码更新方案。同时提供了Unity UI组件在特定情况下无法正常显示的解决思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本文章由cartzhang编写,转载请注明出处。 所有权利保留。
文章链接:http://blog.youkuaiyun.com/cartzhang/article/details/51996538
作者:cartzhang

一、CurvedUI 插件

插件从Asset store上面下载后, 版本为1.7,2016年6月的版本。
官方地址:https://www.assetstore.unity3d.com/en/#!/content/53258
主要的代码有:
一个是编辑器代码,一个是曲面的设置,还有一个就是曲面的算法。
代码还是蛮长的,难度也有。需要的自己看吧!!!这里就不贴出来一一分析了。
用处不大!!!

二、问题


插件很好用。它是UGUI做的,代码写的也很明白。使用UGUI时间长的同学,心里可能会有些抵触。觉得这个用的时候有点不爽。但是这个基本还可以满足要求的。
问题是它的UI的刷新,有些问题。
我们需要的是,在分数增加的时候,可以实时滚动的增加得分条进度。但是数字可以跳动。但是进度就是不走。
在编辑器中需要点击一下Image,然后显示和隐藏一下就可以了。
如下图:
这里写图片描述

就是需要点击红圈内的Image。

这个很明显是刷新问题。
但是怎么解决呢?
没有办法还是先把代码看看吧!!

CurvedUISettings.cs代码:

  void Update()
        {

            //recreate the geometry if entire canvas has been changed
            if ((transform as RectTransform).rect.size != savedRectSize)
            {
                savedRectSize = (transform as RectTransform).rect.size;
                SetUIAngle(angle);
            }

            //check for improper canvas size
            if (savedRectSize.x == 0 || savedRectSize.y == 0)
                Debug.LogError("CurvedUI: Your Canvas size must be bigger than 0!");

            //moving the world space mouse
            if (Controller == CurvedUIController.WORLD_MOUSE)
            {
                //touch can also be used to control a world space mouse, although its probably not the best experience
                //Use standard mouse controller with touch.
                if (Input.touchCount > 0)
                {
                    worldSpaceMouseOnCanvasDelta = Input.GetTouch(0).deltaPosition * worldSpaceMouseSensitivity;
                }
                else {
                    worldSpaceMouseOnCanvasDelta = new Vector2((Input.mousePosition - lastMouseOnScreenPos).x, (Input.mousePosition - lastMouseOnScreenPos).y) * worldSpaceMouseSensitivity;
                    lastMouseOnScreenPos = Input.mousePosition;
                }
                lastWorldSpaceMouseOnCanvas = worldSpaceMouseInCanvasSpace;
                worldSpaceMouseInCanvasSpace += worldSpaceMouseOnCanvasDelta;

                // Debug.Log("mouse canvas pos: " + worldSpaceMouseOnCanvas);
            }

            //更新数据
            foreach (CurvedUIVertexEffect ve in GetComponentsInChildren<CurvedUIVertexEffect>())
                ve.SetDirty();

        }


这个代码太长了。我就贴需要的吧!!!
说明问题即可。

注释部分写汉语的部分下面就是新增加代码。
就是这么简单。

原理也不用多说,就是设脏啊!!这样就可以顺利刷新了。

是不是超级简单。

三、BTW ,UGUI


在使用Unity的过程中,还是发现有某些UI的图片,不点击一下或显示隐藏一下就不能正常显示。
或是使用代码在Start中设置隐藏和显示,然而并没有作用,并卵的节奏。

怎么办?
原理还是一样,就是需要重新给设置一下。可以使用
这里写图片描述

Graphic.SetAllDirty

但是若还不起作用。我们用时候就是这样居然还不好用。
原因是在开始的时候我们有个切换UI,把这个东西给切换隐藏了一下,然后代码并没有执行。
解决方法也简单:
就是使用协同,等待零点几秒,来做个延迟。

IEnumerator Start()
        {
           yield return new WaitForSeconds(0.05f);
            ChangeGunMessage();
        }


然后去SetDirty(),就这样。
个人觉得可能是Unity的bug,或是使用方法的问题。

四、最后

希望大家还是要支持正版,付费去下载。
毕竟还是别人辛勤劳动的结果啊!!!

分享的地址也有,我私下里告诉你!!
谢谢各位!!!

———————–THE—–END———————————–

若有问题,请随时联系!!!
非常感谢!!!

<think>首先,用户的问题是:“我想了解C语言中until的使用方法请问C语言until使用方法示例语法”。这翻译成英文是“Iwanttounderstandtheusageof'until'inClanguage.Pleaseexplaintheusage,examples,andsyntaxof'until'inClanguage.”现在,回想一下C语言的基本知识。在标准C语言中,没有名为“until”的关键字或语句。C语言的控制流结构包括if,else,for,while,do-while等,但没有“until”。用户可能在混淆C语言与其他语言,比如Pascal或某些脚本语言,这些语言有“until”循环。从系统级指令中,我有几个关键点:-所有行内数学表达式必须使用$...$格式。-独立公式必须使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识。-回答结构清晰,帮助用户逐步解决问题。-参考站内引用,但用户提供的引用似乎不直接相关:引用[1]是关于switch语句,引用[2]是关于fopen,引用[3]是关于Delphi和C#的区别,引用[4]是关于GNUC扩展。没有提到“until”。用户的问题焦点是“until”在C语言中的使用。既然C语言没有“until”,我需要澄清这一点。计划我的回答:1.**澄清事实**:首先,明确指出在标准C语言中,没有“until”语句。避免误导用户。2.**解释替代方案**:C语言有“do-while”循环,其行为类似于“repeat-until”在某些语言中。解释如何使用do-while来实现类似功能。3.**提供示例**:给出代码示例来展示如何使用do-while循环。4.**语法解释**:详细说明do-while的语法。5.**添加引用标识**:如果引用任何部分,添加标识。但用户提供的引用不直接相关,所以我可能不需要添加,除非我能关联。6.**生成相关问题**:在末尾,添加相关问题部分。7.**语言**:整个回答用中文。8.**结构**:保持清晰,逐步引导。回答结构:-开头:直接回应问题。-主体:解释C语言中没有until,介绍do-while,语法,示例。-结尾:总结。-相关问题:生成2-3个相关问题。相关问题想法:1.C语言中循环结构有哪些?2.如何用C语言实现类似until的循环?3.do-while循环的常见错误是什么?确保LaTeX:用户问题中没有数学表达式,所以可能不需要。但如果涉及公式,我会使用。例如,如果有计数或逻辑表达式。现在,写回答草稿:-第一段:C语言中没有“until”关键字。它可能源于其他语言如Pascal。-第二段:在C语言中,类似的功能由“do-while”循环提供。do-while执行一次循环体,然后检查条件;如果条件为假,则继续循环。-第三段:语法:`do{statements;}while(condition);`-第四段:示例代码。-第五段:总结。-相关问题。示例代码:用中文注释或解释。例如:```c#include<stdio.h>intmain(){inti=1;do{printf("i=%d\n",i);i++;}while(i<=5);//循环直到i>5return0;}```引用:用户提供的引用不相关,所以可能不需要添加。但如果我能关联,比如引用[1]中switch语句,但不匹配。最好忽略,除非必要。最终回答用中文。</think>### C语言中“until”的使用方法解释 在标准C语言中,**没有名为“until”的关键字或语句**。这可能源于对其他编程语言(如Pascal或某些脚本语言)的混淆,这些语言支持“repeat-until”循环结构(例如,在Pascal中,`repeat ... until condition;`表示循环体至少执行一次,直到条件为真时退出)。C语言使用“do-while”循环来实现类似“repeat-until”的功能:它先执行循环体,再检查条件;如果条件为假,则继续循环;条件为真时退出。以下我将详细解释C语言中的替代方案、语法和示例。 #### 1. **C语言中的替代方案:do-while循环** - **功能描述**:do-while循环是C语言中最接近“until”语义的结构。它保证循环体至少执行一次,然后根据条件决定是否继续循环。这与“repeat-until”逻辑相似,但条件检查逻辑相反: - Pascal中的“until”在条件为真时退出(例如,`until (i > 5)` 表示当i > 5时停止)。 - C语言的do-while在条件为真时继续循环(例如,`while (i <= 5)` 表示当i <= 5时继续)。 - 数学上,do-while的循环条件可表示为:执行循环体后,检查条件 $P$,如果 $P$ 为真则继续,否则退出。 - **语法格式**: ```c do { // 循环体语句 } while (condition); // 注意:condition 必须是布尔表达式(如 i < 10) ``` - **关键点**: - `do` 和 `while` 是C语言关键字。 - 循环体必须用花括号 `{}` 包围(即使只有一条语句)。 - 条件 `condition` 写在 `while` 后的括号中;条件为真时循环继续,为假时退出。 - 结尾必须有分号 `;`。 - **与“until”的对比**: - 如果您需要“直到条件为真时退出”的行为,只需在do-while的条件中取反。例如,Pascal的 `until (x > 10)` 在C中可写为 `while (!(x > 10))` 或 `while (x <= 10)`。 #### 2. **示例代码** 以下是一个完整示例,展示如何使用do-while循环实现“重复执行,直到满足条件”的逻辑。程序要求用户输入数字,直到输入值大于5时退出。 ```c #include <stdio.h> int main() { int num; printf("输入一个数字(输入值 > 5 时退出):\n"); do { scanf("%d", &num); // 读取用户输入 printf("当前值: %d\n", num); } while (num <= 5); // 条件为真时继续循环(相当于:直到 num > 5 时退出) printf("循环已退出,因为输入值大于5。\n"); return 0; } ``` - **代码解释**: - 循环体(`scanf` 和 `printf`)至少执行一次。 - 条件 `num <= 5`:当输入值小于或等于5时,循环继续;当输入值大于5时,条件为假,循环退出。 - 输出示例: - 若输入3,输出“当前值: 3”,并继续提示输入。 - 若输入6,输出“当前值: 6”,然后退出并打印结束消息。 #### 3. **常见注意事项** - **条件逻辑**:do-while的条件是“继续循环的条件”,而非“退出条件”。如果需要模拟“until”,确保条件取反。例如: - Pascal的 `until (flag == true)` 在C中写为 `while (flag != true)` 或 `while (!flag)`。 - **错误避免**: - 忘记结尾分号会导致编译错误。 - 循环体内不更新条件变量可能造成无限循环(例如,在循环中未修改 `num`)。 - **与while循环的区别**:while循环先检查条件再执行体(可能一次都不执行),而do-while保证至少执行一次。选择依据是否需要初始执行。 #### 总结 在C语言中,没有直接的“until”语句,但**do-while循环是其等效替代**。通过调整条件逻辑,可以实现“直到条件满足时退出”的行为。始终记住:do-while在条件为真时继续循环,这与“until”的退出逻辑相反,但通过简单取反即可映射。如果您在使用中遇到问题,建议查阅C语言标准文档或编译器手册以确认语法细节[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值