统一滑动以调整正方形大小

smokereaper98

成员
已加入
2019年11月16日
留言内容
12
编程经验
1-3
可以说我有一个2x2的正方形。当我向上滑动手指时,我希望它在Y轴上变大,在X轴方向上..当我向下滑动手指时,我希望它在Y轴上变小而在X轴上变大。
帮助p.jpg

我有一些代码,但我不喜欢它是如何工作的。有人可以帮助我创造更好的东西吗?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
我有一些代码,但我不喜欢它是如何工作的。
因此,向我们展示代码并解释您对此不满意的地方。如果看不到它,我们就不知道这是怎么回事。
 

smokereaper98

成员
已加入
2019年11月16日
留言内容
12
编程经验
1-3
使用System.Collections;
使用UnityEngine.Android;
使用UnityEngine;
使用System.Diagnostics;

公共课ScaleChanger:MonoBehaviour
{
私人刚体rb;
私人流通量
public float sens;
私人Vector3规模;
私人浮动deltaYX;


void Start()
{
rb = GetComponent<Rigidbody>();
}


void Update()
{

如果(Input.touchCount> 0)
{
Touch touch = Input.GetTouch(0);
Vector3 touchPos =(touch.position * Time.fixedDeltaTime);

switch (touch.phase)
{
案例TouchPhase.Began:
deltaY = touchPos.y-transform.localScale.y;
UnityEngine.Debug.Log("transform.localScale.y ="+ transform.localScale.y +" touchPos.y="+touchPos.y+" deltaY="+deltaY);
break;
大小写TouchPhase.Moved:
scale = new Vector3(Mathf.Clamp((deltaY-touchPos.y)+1 + transform.localScale.x,1,5),Mathf.Clamp(touchPos.y-deltaY,1,4),1);
UnityEngine.Debug.Log("x= "+((deltaY-touchPos.y)+ 1 + transform.localScale.x)+"y="+(touchPos.y-deltaY));
transform.localScale =比例尺;
break;
}
}


}
}



这是代码..当我玩游戏时它有点不稳定,并且不太流畅..我确定它是错误的,但是我找不到解决方法。它甚至不起作用是我想要它起作用..多维数据集从1x1到5x1到1x5,我想要它,如上一篇文章中所附的图片所示
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
不使用代码标签怎么办?

[CODE=csharp] Post your code here [/CODE]

发布到论坛时,请使用代码标签。
 

smokereaper98

成员
已加入
2019年11月16日
留言内容
12
编程经验
1-3
C#:
使用System.Collections;
使用UnityEngine.Android;
using UnityEngine;
使用System.Diagnostics;

公共课ScaleChanger:MonoBehaviour
{
    私人刚体rb;
    私人流通量
    public float sens;
    私人Vector3规模;
    私人浮动deltaYX;


    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }


    void Update()
    {

        如果(Input.touchCount> 0)
        {
            Touch touch = Input.GetTouch(0);
            Vector3 touchPos =(touch.position * Time.fixedDeltaTime);

                switch (touch.phase)
            {
                案例TouchPhase.Began:
                    deltaY = touchPos.y-transform.localScale.y;
                    UnityEngine.Debug.Log("transform.localScale.y ="+ transform.localScale.y +" touchPos.y="+touchPos.y+" deltaY="+deltaY);
                    break;
                大小写TouchPhase.Moved:
                    scale = new Vector3(Mathf.Clamp((deltaY-touchPos.y)+1 + transform.localScale.x,1,5),Mathf.Clamp(touchPos.y-deltaY,1,4),1);
                    UnityEngine.Debug.Log("x= "+((deltaY-touchPos.y)+ 1 + transform.localScale.x)+"y="+(touchPos.y-deltaY));
                   transform.localScale =比例尺;
                    break;
            }
            }


        }
}
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
对于我们来说,这确实不是一个实际的问题。这对于您进行调试将更为实用。由于我们没有您的游戏对象,因此无法调试它,因为没有任何要连接的转换,并且由于我手边没有触摸设备,因此我也无法对其进行测试。我在这台电脑上也没有统一感。

为什么要从touchPos.y中减去deltaY,然后再递增1,然后向其添加另一个轴?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
我觉得OP会以错误的方式计算高度和宽度。在他的鞋子中,我将计算正方形的面积-在这种情况下为2x2 ==4。我建议计算触摸起点和当前触摸位置之间的差。用最大允许范围的一半来缩放此差异。这成为新的高度。由于目标是使矩形的面积保持恒定,因此,将面积除以高度将得出矩形的所需宽度。
 

smokereaper98

成员
已加入
2019年11月16日
留言内容
12
编程经验
1-3
首先,非常感谢您的回复。.我尝试使自己的自我更加具体..我只想知道我是否有更好,更可靠的方式来读取手指运动,以及如何将其连接到立方体的比例,使其表现出我之前告诉您的方式。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
我建议您遵循以下文档: Unity-脚本API:Input.GetTouch 他们有指针和一些示例代码。请留意VS警告部分,因为某些API可能已被弃用,并且Unity在更改某些内容时并不总是更新其站点上的每个文档。按照#7中的建议以及这些文档,您应该发现它很容易实现。您也没有回答我的问题。但是干草,你去了。
 

smokereaper98

成员
已加入
2019年11月16日
留言内容
12
编程经验
1-3
由于您的帮助,我更改了整个代码。.我认为它现在可以工作了。看一下,告诉我是否可以缩小它。它没有必要,但我认为它可以变小哈哈 :p

C#:
使用System.Collections;
使用UnityEngine.Android;
using UnityEngine;
使用System.Diagnostics;

公共课ScaleChanger:MonoBehaviour
{
    私人刚体rb;
    私人流通量
    public float sens;
    私人Vector3规模;
    private float distance;


    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }


    void Update()
    {

        如果(Input.touchCount> 0)
        {
            Touch touch = Input.GetTouch(0);
            Vector3 touchPos =(touch.position * Time.fixedDeltaTime);
            scale = new Vector3(transform.localScale.x, transform.localScale.y, 2);
            switch (touch.phase)
            {
                案例TouchPhase.Began:
                    //deltaY is the starting point of your finger
                    deltaY = touchPos.y;
                    break;
                大小写TouchPhase.Moved:
                    //finger down
                    if (deltaY - 3 > touchPos.y)
                    {
                        scale = new Vector3(Mathf.Clamp(transform.localScale.x + (deltaY + 3 - touchPos.y) / sens, 1, 5), Mathf.Clamp(transform.localScale.y - (deltaY + 3 - touchPos.y) / sens, 1, 5), 2);
                    }
                    //finger up
                    else if (deltaY + 3 <= touchPos.y)
                    {
                        scale = new Vector3(Mathf.Clamp(transform.localScale.x - ((deltaY + 3 - touchPos.y) * -1) / sens * 3, 1, 5), Mathf.Clamp(transform.localScale.y + ((deltaY + 3 - touchPos.y) * -1) / sens * 3, 1, 5), 2);
                        UnityEngine.Debug.Log("ok 3");
                    }
                    //finger down
                    else if (deltaY - 2 > touchPos.y)
                    {
                        scale = new Vector3(Mathf.Clamp(transform.localScale.x + (deltaY + 2 - touchPos.y) / (sens * 5), 1, 5), Mathf.Clamp(transform.localScale.y - (deltaY + 2 - touchPos.y) / (sens * 5), 1, 5), 2);
                    }
                    //finger up little
                    else if (deltaY + 2 <= touchPos.y)
                    {
                        scale = new Vector3(Mathf.Clamp(transform.localScale.x - ((deltaY + 2 - touchPos.y) * -1) / (sens * 5), 1, 5), Mathf.Clamp(transform.localScale.y + ((deltaY + 2 - touchPos.y) * -1) / (sens * 5), 1, 5), 2);
                        UnityEngine.Debug.Log("ok 2");
                    }
                    //finger down very little
                    else if (deltaY - 1.5 > touchPos.y)
                    {
                        scale = new Vector3(Mathf.Clamp(transform.localScale.x + (deltaY + 1.5f - touchPos.y) / (sens * 10), 1, 5), Mathf.Clamp(transform.localScale.y - (deltaY + 1.5f - touchPos.y) / (sens * 10), 1, 5), 2);
                    }
                    //finger up very little
                    else if (deltaY + 1.5 <= touchPos.y)
                    {
                        scale = new Vector3(Mathf.Clamp(transform.localScale.x - ((deltaY + 1.5f - touchPos.y) * -1) / (sens * 10), 1, 5), Mathf.Clamp(transform.localScale.y + ((deltaY + 1.5f - touchPos.y) * -1) / (sens * 10), 1, 5), 2);
                        UnityEngine.Debug.Log("ok 1");
                    }

                    /* deltaY live movement try (not working properly)*/
                    //finger up deltaY renew
                    if (deltaY < touchPos.y - 5)
                    {
                        deltaY = touchPos.y - 3;
                    }
                    //finger down deltaY renew
                    if (deltaY > touchPos.y + 5)
                    {
                        deltaY = touchPos.y + 4;
                    }


                    transform.localScale = scale;
                    break;


            }
        }


    }
}


非常感谢您的帮助 :D
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,933
地点
英国
编程经验
10+
C#:
scale = new Vector3(Mathf.Clamp(transform.localScale.x + (deltaY + 3 - touchPos.y) / sens, 1, 5), Mathf.Clamp(transform.localScale.y - (deltaY + 3 - touchPos.y) / sens, 1, 5), 2);
我只建议您创建一个仅用于计算向量和钳位的内部类。这只是偏爱;但是我更喜欢将逻辑从何处计算出来,以及用新参数初始化对象的位置,并改用返回类型。它还使疑难解答变得更容易,并且在C#中被认为是最佳实践。看 //forum.unity.com/threads/implement-separate-classes-for-ui-and-logic-game.490118/ 并且 罗伯特的编码规则:#11将用户界面逻辑与业务逻辑分开 虽然这不是世界上最好的帖子,但他的博客提出了与我相同的观点。

很高兴您找到了可行的解决方案。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
Why do does these two vary for the factor multiplied with sens depending on up or down?
C#:
if (deltaY - 3 > touchPos.y)
{
    scale = new Vector3(Mathf.Clamp(transform.localScale.x + (deltaY + 3 - touchPos.y) / sens, 1, 5),
                        Mathf.Clamp(transform.localScale.y - (deltaY + 3 - touchPos.y) / sens, 1, 5),
                        2);
}
else if (deltaY + 3 <= touchPos.y)
{
    scale = new Vector3(Mathf.Clamp(transform.localScale.x - ((deltaY + 3 - touchPos.y) * -1) / sens * 3, 1, 5),
                        Mathf.Clamp(transform.localScale.y + ((deltaY + 3 - touchPos.y) * -1) / sens * 3, 1, 5),
                        2);
}
In all the other cases, sens is multiplied by the same factor (5 or 10) regardless of up or down direction?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,536
地点
弗吉尼亚州切萨皮克
编程经验
10+
假设向上或向下的因素相同,则以下内容应缩短第10条后的第36-68行。
First declare the following class and static list within your ScaleChanger class:
C#:
class SensitivityFactor
{
    public float Level { get; set; }
    public float Factor { get; set; }
}

static List<SensitivityFactor> SensitivityFactors = new List<SensitivityFactor>()
{
    new SensitivityFactor() { Level = 3.0f, Factor =  3.0f },
    new SensitivityFactor() { Level = 2.0f, Factor =  5.0f },
    new SensitivityFactor() { Level = 1.5f, Factor = 10.0f },
}

然后,您可以将第36-68行替换为:
C#:
var realDelta = deltaY - touchPos.y;
var absDelta = Math.Abs(realDelta);
var sensitivityFactor = SensitivityFactors.FirstOrDefault(sf => sf.Level >= absDelta);
if (sensitivityFactor != null)
{
    var signDelta = Math.Abs(realDelta);
    var adjust = (realDelta + sensitivityFactor.Level) * signDelta / (sens * sensitivityFactor.Factor);
    scale = new Vector3(Mathf.Clamp(transform.localScale.x - adjust, 1, 5),
                        Mathf.Clamp(transform.localScale.y + adjust, 1, 5),
                        2);
}
 

smokereaper98

成员
已加入
2019年11月16日
留言内容
12
编程经验
1-3
Why do does these two vary for the factor multiplied with sens depending on up or down?
C#:
if (deltaY - 3 > touchPos.y)
{
    scale = new Vector3(Mathf.Clamp(transform.localScale.x + (deltaY + 3 - touchPos.y) / sens, 1, 5),
                        Mathf.Clamp(transform.localScale.y - (deltaY + 3 - touchPos.y) / sens, 1, 5),
                        2);
}
else if (deltaY + 3 <= touchPos.y)
{
    scale = new Vector3(Mathf.Clamp(transform.localScale.x - ((deltaY + 3 - touchPos.y) * -1) / sens * 3, 1, 5),
                        Mathf.Clamp(transform.localScale.y + ((deltaY + 3 - touchPos.y) * -1) / sens * 3, 1, 5),
                        2);
}
In all the other cases, sens is multiplied by the same factor (5 or 10) regardless of up or down direction?
由于某种原因,如果我不乘以3,它会比另一个方向慢,而且我也不知道为什么。所以我觉得很好 :p
 

smokereaper98

成员
已加入
2019年11月16日
留言内容
12
编程经验
1-3
我只建议您创建一个仅用于计算向量和钳位的内部类。这只是偏爱;但是我更喜欢将逻辑从何处计算出来,以及用新参数初始化对象的位置,并改用返回类型。它还使疑难解答变得更容易,并且在C#中被认为是最佳实践。看 //forum.unity.com/threads/implement-separate-classes-for-ui-and-logic-game.490118/ 并且 罗伯特的编码规则:#11将用户界面逻辑与业务逻辑分开 虽然这不是世界上最好的帖子,但他的博客提出了与我相同的观点。

很高兴您找到了可行的解决方案。
非常感谢您的帮助。.il查找并尝试按照您说的做.. il保持更新 :D
 

smokereaper98

成员
已加入
2019年11月16日
留言内容
12
编程经验
1-3
假设向上或向下的因素相同,则以下内容应缩短第10条后的第36-68行。
First declare the following class and static list within your ScaleChanger class:
C#:
class SensitivityFactor
{
    public float Level { get; set; }
    public float Factor { get; set; }
}

static List<SensitivityFactor> SensitivityFactors = new List<SensitivityFactor>()
{
    new SensitivityFactor() { Level = 3.0f, Factor =  3.0f },
    new SensitivityFactor() { Level = 2.0f, Factor =  5.0f },
    new SensitivityFactor() { Level = 1.5f, Factor = 10.0f },
}

然后,您可以将第36-68行替换为:
C#:
var realDelta = deltaY - touchPos.y;
var absDelta = Math.Abs(realDelta);
var sensitivityFactor = SensitivityFactors.FirstOrDefault(sf => sf.Level >= absDelta);
if (sensitivityFactor != null)
{
    var signDelta = Math.Abs(realDelta);
    var adjust = (realDelta + sensitivityFactor.Level) * signDelta / (sens * sensitivityFactor.Factor);
    scale = new Vector3(Mathf.Clamp(transform.localScale.x - adjust, 1, 5),
                        Mathf.Clamp(transform.localScale.y + adjust, 1, 5),
                        2);
}
il更改脚本,我会及时通知您 :D 非常感谢您的帮助 :)
 
最佳 底部