查看: 2635|回复: 4
打印 上一主题 下一主题

[其他] 滑动列表时实现平滑阻尼效果修改

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-3-12 21:54:28 |只看该作者 |倒序浏览

初始篇:

public GameObject groupObj;
float smoothTime = 0.1F;
float yVelocity = 0.0F;
float newPosition;
float temp;

float target;
void Update () {

if(Input.touchCount>0&&Input.GetTouch(0).phase==TouchPhase.Began)

temp=groupObj.transform.position.y;

if(Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved){

Ray rayM = Camera.main.ScreenPointToRay (Input.mousePosition);

RaycastHit hitM;

if(Physics.Raycast (rayM, out hitM, 1000)&&hitM.transform.name=="Group"){

target=temp+Input.GetTouch(0).deltaPosition.y*10;

newPosition = Mathf.SmoothDamp(groupObj.transform.position.y,target, ref yVelocity, smoothTime);

groupObj.transform.position=new Vector3(groupObj.transform.position.x,newPosition,groupObj.transform.position.z);

}

}

else{

if(target>700)

target=700;

if(target<0)

target=0;

if(groupObj.transform.position!=new Vector3(groupObj.transform.position.x,target,groupObj.transform.position.z)){

print("move"+ target);

newPosition = Mathf.SmoothDamp(groupObj.transform.position.y,target, ref yVelocity, smoothTime);

groupObj.transform.position=new Vector3(groupObj.transform.position.x,newPosition,groupObj.transform.position.z);

}

}

}

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

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

[csharp] view plaincopy
float touchDeltaPositionX;
float touchDeltaPositionY;
float maxX=0f;
float maxY=0f;
float targetX=0f;
float targetY=0f;
float newPositionX;
float newPositionY;


[csharp] view plaincopy
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);
}
}
}
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

23

主题

0

听众

1102

积分

助理设计师

Rank: 4

纳金币
1549
精华
0

活跃会员

沙发
发表于 2014-3-12 22:00:01 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

0

主题

1

听众

260

积分

设计实习生

Rank: 2

纳金币
47
精华
0

最佳新人

板凳
发表于 2014-3-19 15:22:11 |只看该作者
谢谢分享
回复

使用道具 举报

Mr_X    

5

主题

1

听众

2440

积分

中级设计师

Rank: 5Rank: 5

纳金币
179
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2014-3-23 09:51:50 |只看该作者
直接贴代码的NB
回复

使用道具 举报

jedi    

0

主题

1

听众

248

积分

设计实习生

Rank: 2

纳金币
7
精华
0

最佳新人

5#
发表于 2014-3-31 15:30:28 |只看该作者
好文章 谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-14 05:18 , Processed in 0.294969 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部