unity特效缩放

2015年01月20日 10:26 0 点赞 0 评论 更新于 2025-11-21 14:53

本文将详细分享Unity中实现特效旋转与缩放的流程及代码。

一、旋转操作

在Unity里,有多种旋转函数可供选择,经过测试,最终选用RotateAround函数来实现物体的旋转。

Input.GetAxis("Mouse X")的值是右正左负,Input.GetAxis("Mouse Y")的值是上正下负。这两个函数返回的值会依据手势(或鼠标)的方向和速度而改变。利用这两个函数,就能实现通过手势控制物体旋转。需要注意的是,要亲自体验Input.GetAxis("Mouse X/Y")的用法,并留意旋转方向。

二、缩放操作

缩放手势可通过两个手指模拟,当两手指间的距离逐渐增大,物体放大;反之则缩小。放大物体有以下两种方法:

  1. 使用localScale属性:通过物体的localScale属性来放大物体,但在实际使用中,这种方法可能无法达到预期效果。
  2. 拉近摄像机:这里面有一定的技术要点。在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项目中更好地实现特效的旋转与缩放功能。下一篇文章将探讨《让物体有惯性的旋转》。