如何在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
is1,1,1
,对这两个对象来说,Scale都是1,1,1
,在转换停止时查看更新的gif,但不要在图像的末尾。感谢使用协同程序的提示,我将尝试你的片段来获得距离。这可能是一个很好的解决方案。我们所有人都不会遇到专业人士;)我刚刚注意到,在我的示例中,我忘了输入PingPong
^^^^^现在更新了,我还将通过添加Mathf.PingPong
解决方案的提示来编辑主题length
参数Mathf.PingPong
的作用是什么?