如何在Unity3D中获得画布和缩放图像之间的宽度差并实现有效的乒乓球效果

如何在Unity3D中获得画布和缩放图像之间的宽度差并实现有效的乒乓球效果,unity3d,Unity3d,我试图获得画布和图像之间的宽度差,该图像由canvascaler缩放,以便在图像和边框之间创建转换 插图: 如何获得红色箭头的大小 [编辑1] 下面的代码片段为我提供了一个可能正确的结果 var dist=(canvasRectTransform.rect.width-image.sprite.rect.width)/2; 但这似乎是不正确的: 公共类背景:单一行为 { 私人浮动区; 私人持股比例; 私人浮动时间` 专用只读词典_lerpDirectionActions; 公共浮动时间; 无

我试图获得画布和图像之间的宽度差,该图像由
canvascaler
缩放,以便在图像和边框之间创建转换

插图:

如何获得红色箭头的大小

[编辑1]

下面的代码片段为我提供了一个可能正确的结果

var dist=(canvasRectTransform.rect.width-image.sprite.rect.width)/2;
但这似乎是不正确的:

公共类背景:单一行为
{
私人浮动区;
私人持股比例;
私人浮动时间`
专用只读词典_lerpDirectionActions;
公共浮动时间;
无效唤醒()
{
var image=GetComponent();
var canvasRectTransform=getComponentParent();
dist=(canvasRectTransform.rect.width-image.sprite.rect.width)/2;
_lerpDirectionActions=新字典
{
[LerpDirection.Left]=LerpToLeft,
[LerpDirection.Right]=LerpToRight
};
}
私有向量3 Lerp()
{
返回向量3.Lerp(
变换位置,
_lerpDirectionActions[lerpDirection].Invoke(),//将调用LerpToRight或LerpToLeft
_百分比
);
}
私有浮点LerpX=>Lerp().x;
私有向量3 LerpToRight()
{
返回新矢量3(transform.position.x-dist,transform.position.y);
}
私有向量3 LerpToLeft()
{
返回新矢量3(transform.position.x+dist,transform.position.y);
}
无效更新()
{
_currentLerpTime+=Time.deltaTime;
_百分比=_currentLerpTime/lerpTime;
var localPositionX=tranform.position.x;
var mustGoRight=localPositionX=dist&&lerpDirection==lerpDirection.Left;
if(mustGoLeft | | mustGoRight)
{
方向=方向。反转();//反转方向
重置();
}
tranform.position=新矢量3(LerpX,tranform.position.y)
}
}
Background
脚本应用于Background游戏对象

\u lerpDirectionActions[lerpDirection].Invoke()
上面的代码将调用right函数来在左侧或右侧执行lerping

插图:


平移会改变他的方向,但当画布位于图像的边框上时不会改变方向。

您要搜索的值将是

var差=(canvas.GetComponent().rect.width-image.GetComponent().rect.width)/2f;
老实说,你的剧本看起来很复杂

为什么不简单地把它放在一个单一的使用它做什么,你目前控制你的方向标志和行动

乒乓球的t值,因此它永远不会大于长度,也永远不会小于0

返回值将在0和长度之间来回移动

公共画布;
公众形象;
//完成从一个极端到另一个极端的移动的时间(以秒为单位)
公共浮动持续时间=1;
私有void Start()
{
启动例程(LerpForthAndBack());
}
私人IEnumerator LerpForthAndBack()
{
变量差异=(canvas.GetComponent().rect.width-image.GetComponent().rect.width)/2f;
var maxPosition=Vector3.right*差;
var minPosition=Vector3.left*差;
//休
//->这在协同程序中实际上是完全正确的
//只要你在其中的某个地方屈服
while(true)
{
image.transform.position=Vector3.Lerp(minPosition、maxPosition、Mathf.PingPong(Time.Time/duration,1));
//“暂停”例程,渲染帧和
//在下一帧中从这里继续
收益返回空;
}
}
当然,您也可以在
Update

私有向量3最小位置;
专用矢量3最大位置;
私有void Start()
{
变量差异=(canvas.GetComponent().rect.width-image.GetComponent().rect.width)/2f;
maxPosition=Vector3.right*差;
最小位置=矢量3.left*差;
}
私有void更新()
{
image.transform.position=Vector3.Lerp(minPosition、maxPosition、Mathf.PingPong(Time.Time/duration,1));
}

(canvas.GetComponent().rect.width-image.GetComponent().rect.width)/2f
?是的,它可以工作,但我有一个奇怪的行为我会编辑我的回答我不明白你的意思。。在gif中,您应该知道它在结束之前永远不会到达边界。。你的实际目标是什么?句子
给我一个正确的结果
但似乎不正确
有点矛盾^^你的脚本似乎不完整。。至少很难说你是如何移动两个对象的
Scale
is
1,1,1
,对这两个对象来说,Scale都是
1,1,1
,在转换停止时查看更新的gif,但不要在图像的末尾。感谢使用协同程序的提示,我将尝试你的片段来获得距离。这可能是一个很好的解决方案。我们所有人都不会遇到专业人士;)我刚刚注意到,在我的示例中,我忘了输入
PingPong
^^^^^现在更新了,我还将通过添加
Mathf.PingPong
解决方案的提示来编辑主题
length
参数
Mathf.PingPong
的作用是什么?