Unity 滑动列表时实现平滑阻尼效果修改篇

之前的方法实现出来的效果不太好,会出现不在边界也会有,一拖动就返回的现象,所以又重新修改了一下,不同的地方在于将边界检测与正常情况拖动进行了分类处理。

正常情况的检测是通过间接控制速度,边界检测则是控制位移;之前的是列表的,只能纵向拖动,现在修改了之后改为不限定方向,只要不出一个矩形框的范围就行。

float touchDeltaPositionX;
float touchDeltaPositionY;
float maxX=0f;
float maxY=0f;
float targetX=0f;
float targetY=0f;
float newPositionX;
float newPositionY;	


 
  
if(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved){
				touchDeltaPositionX=Input.GetTouch(0).deltaPosition.x;
				touchDeltaPositionY= Input.GetTouch(0).deltaPosition.y;
				maxX=Mathf.Max(maxX,Mathf.Abs(touchDeltaPositionX));
			    maxY=Mathf.Max(maxY,Mathf.Abs(touchDeltaPositionY));
				if(touchDeltaPositionX<0)
					maxX=-maxX;				
				if(touchDeltaPositionY<0)
					maxY=-maxY;
				    groupObj.transform.Translate(maxX*Time.deltaTime*10,maxY*Time.deltaTime*10,0);
		}
		else{
				if(groupObj.transform.position.y>=-170&&groupObj.transform.position.y<=670f&&groupObj.transform.position.x>=-680&&groupObj.transform.position.x<=500){
					if(!Mathf.Approximately(maxX,0f)||!Mathf.Approximately(maxY,0f)){
						maxX=Mathf.MoveTowards(maxX,0f,0.6f);
						maxY=Mathf.MoveTowards(maxY,0f,0.6f);	
				   }
				   groupObj.transform.Translate(maxX*Time.deltaTime*10,maxY*Time.deltaTime*10,0);
				}
			else{
				maxY=0;
				maxX=0;
				targetX=groupObj.transform.position.x;
				targetY=groupObj.transform.position.y;
				if(groupObj.transform.position.x>500)
					targetX=500;
				if(groupObj.transform.position.x<-680)
					targetX=-680;						
				if(groupObj.transform.position.y>670)
					targetY=670;
				if(groupObj.transform.position.y<-170)
					targetY=-170;	
					newPositionX = Mathf.SmoothDamp(groupObj.transform.position.x, targetX,ref xVelocity, smoothTime);
					newPositionY = Mathf.SmoothDamp(groupObj.transform.position.y,targetY, ref yVelocity, smoothTime);
			   		groupObj.transform.position=new Vector3(newPositionX,newPositionY,groupObj.transform.position.z);
			}
		}
		}

你可能感兴趣的:(unity)