最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
unity特效缩放
本文将详细分享Unity中实现特效旋转与缩放的流程及代码。
一、旋转操作
在Unity里,有多种旋转函数可供选择,经过测试,最终选用RotateAround函数来实现物体的旋转。
Input.GetAxis("Mouse X")的值是右正左负,Input.GetAxis("Mouse Y")的值是上正下负。这两个函数返回的值会依据手势(或鼠标)的方向和速度而改变。利用这两个函数,就能实现通过手势控制物体旋转。需要注意的是,要亲自体验Input.GetAxis("Mouse X/Y")的用法,并留意旋转方向。
二、缩放操作
缩放手势可通过两个手指模拟,当两手指间的距离逐渐增大,物体放大;反之则缩小。放大物体有以下两种方法:
- 使用
localScale属性:通过物体的localScale属性来放大物体,但在实际使用中,这种方法可能无法达到预期效果。 - 拉近摄像机:这里面有一定的技术要点。在OpenGL中,常用铁轨来比喻视觉效果,实际的铁轨是平行且不相交的,但在视觉上,铁轨间的距离会越来越近,最终相交。Unity 3D默认采用相交效果(
camera --> Projection --> perspective),也有不相交的效果(camera --> Projection --> orthographic),两种效果差异明显。如果要加入天空盒,并且不想让天空背景随物体缩放而移动,建议选择第二种效果。
代码实现
初始代码
var rotatepos: Transform; // rotatepos是该物体的一个子物体,放到物体的中心地方就行。
var horizontalSpeed: float;
var verticalSpeed: float;
var flag: boolean;
var olddis: float = 0;
var newdis: float = 0;
var child: Transform;
function Start() {
horizontalSpeed = 0;
verticalSpeed = 0;
flag = true;
}
function Update() {
if (flag) {
transform.RotateAround(rotatepos.position, Vector3.up, 1);
}
// 物体的旋转
if (Input.touchCount == 1) {
if (Input.GetTouch(0).phase == TouchPhase.Moved) {
flag = false;
var h: float = Input.GetAxis("Mouse X"); // 右正左负
var v: float = Input.GetAxis("Mouse Y"); // 上正下负
if (Mathf.Abs(h) >= Mathf.Abs(v)) {
if (h < 0) {
horizontalSpeed = 6;
transform.RotateAround(rotatepos.position, Vector3.up, horizontalSpeed);
}
if (h > 0) {
horizontalSpeed = 6;
transform.RotateAround(rotatepos.position, -Vector3.up, horizontalSpeed);
}
} else {
if (v < 0) {
verticalSpeed = 6;
transform.RotateAround(rotatepos.position, -Vector3.right, verticalSpeed);
}
if (v > 0) {
verticalSpeed = 6;
transform.RotateAround(rotatepos.position, Vector3.right, verticalSpeed);
}
}
}
}
// 物体的缩放
if (Input.touchCount > 1) {
flag = false;
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved) {
var pos1 = Input.GetTouch(0).position;
var pos2 = Input.GetTouch(1).position;
newdis = Vector2.Distance(pos1, pos2);
if (olddis != null) {
if (newdis < olddis) {
Camera.main.camera.orthographicSize += 2;
}
if (newdis > olddis) {
Camera.main.camera.orthographicSize -= 2;
}
}
olddis = newdis;
}
}
// 按返回键退出程序
if (Input.GetKey(KeyCode.Escape)) {
Application.Quit();
}
}
上述代码存在一定局限性,并非适用于所有物体。下面对代码进行改进,使其能适用于各种物体。
改进后的代码
var horizontalSpeed: float = 0;
var newdis: float = 0;
var olddis: float = 0;
function Update() {
// 物体的旋转
if (Input.touchCount == 1) {
if (Input.GetTouch(0).phase == TouchPhase.Moved) {
var h: float = Input.GetAxis("Mouse X"); // 右正左负
if (h < 0) {
horizontalSpeed = 1.5;
transform.Rotate(transform.up * horizontalSpeed);
}
if (h > 0) {
horizontalSpeed = 1.5;
transform.Rotate(-transform.up * horizontalSpeed);
}
}
}
// 物体的缩放
if (Input.touchCount > 1) {
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved) {
var pos1 = Input.GetTouch(0).position;
var pos2 = Input.GetTouch(1).position;
newdis = Vector2.Distance(pos1, pos2);
if (olddis != null) {
if (newdis < olddis) {
Camera.main.camera.orthographicSize += 0.2;
}
if (newdis > olddis) {
Camera.main.camera.orthographicSize -= 0.2;
}
if (Camera.main.camera.orthographicSize < 0) {
Camera.main.camera.orthographicSize = 0;
}
if (Camera.main.camera.orthographicSize > 10) {
Camera.main.camera.orthographicSize = 10;
}
}
olddis = newdis;
}
}
// 按返回键退出程序
if (Input.GetKey(KeyCode.Escape)) {
Application.Quit();
}
}
总结
本文介绍了Unity中实现特效旋转和缩放的方法及代码。通过对旋转和缩放操作的详细讲解,以及代码的逐步实现和优化,希望能帮助你在Unity项目中更好地实现特效的旋转与缩放功能。下一篇文章将探讨《让物体有惯性的旋转》。