最新文章
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
unity3d 单个物体缩放旋转
2015年01月23日 11:57
0 点赞
0 评论
更新于 2025-11-21 15:11
本文将详细介绍 Unity3D 中单个物体的旋转与缩放问题,并提供相应的源代码供大家参考。
以下是实现单个物体缩放旋转功能的完整代码:
using UnityEngine;
using System.Collections;
public class ThisRotate : MonoBehaviour
{
// 定义相关向量变量
Vector3 StartPosition;
Vector3 previousPosition;
Vector3 offset;
Vector3 finalOffset;
Vector3 eulerAngle;
// 定义布尔变量用于标记是否滑动
bool isSlide;
// 定义旋转角度变量
float angle;
// 定义缩放比例,初始值为 1
public float scale = 1;
// 定义射线投射命中信息变量
RaycastHit hit;
void Start()
{
// Start 方法可用于初始化操作,这里暂时为空
}
void OnGUI()
{
// 从主相机向鼠标位置发射一条射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// 进行射线投射,如果命中物体
if (Physics.Raycast(ray, out hit))
{
// 检查命中的物体是否为当前脚本所挂载的物体
if (hit.transform == transform)
{
// 检查鼠标滚轮是否有滚动操作
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
// 打印鼠标滚轮滚动的值
Debug.Log(Input.GetAxis("Mouse ScrollWheel"));
// 根据鼠标滚轮滚动值更新缩放比例
scale = scale + Input.GetAxis("Mouse ScrollWheel");
// 更新物体的局部缩放
transform.localScale = new Vector3(1 + scale, 1 + scale, 1 + scale);
}
}
}
}
void Update()
{
// 检查鼠标左键是否按下
if (Input.GetMouseButtonDown(0))
{
// 记录鼠标按下时的初始位置
StartPosition = Input.mousePosition;
// 记录鼠标按下时的上一位置
previousPosition = Input.mousePosition;
}
// 检查鼠标左键是否持续按下
if (Input.GetMouseButton(0))
{
// 计算鼠标当前位置与上一位置的偏移量
offset = Input.mousePosition - previousPosition;
// 更新上一位置为当前位置
previousPosition = Input.mousePosition;
// 绕垂直于偏移向量和向前向量的轴旋转物体
transform.Rotate(Vector3.Cross(offset, Vector3.forward).normalized, offset.magnitude, Space.World);
}
// 检查鼠标左键是否释放
if (Input.GetMouseButtonUp(0))
{
// 计算鼠标释放时的最终偏移量
finalOffset = Input.mousePosition - StartPosition;
// 标记为滑动状态
isSlide = true;
// 记录最终偏移量的大小作为旋转角度
angle = finalOffset.magnitude;
}
// 如果处于滑动状态
if (isSlide)
{
// 继续旋转物体
transform.Rotate(Vector3.Cross(finalOffset, Vector3.forward).normalized, angle * 2 * Time.deltaTime, Space.World);
// 如果旋转角度大于 0
if (angle > 0)
{
// 减小旋转角度
angle -= 5;
}
else
{
// 旋转角度归零
angle = 0;
}
}
}
}
代码解释
- 变量定义:在类中定义了多个向量变量用于记录鼠标位置和偏移量,布尔变量
isSlide用于标记是否处于滑动状态,angle用于记录旋转角度,scale用于控制物体的缩放比例,hit用于存储射线投射的命中信息。 Start方法:在游戏开始时调用,可用于初始化操作,这里暂时为空。OnGUI方法:每帧都会调用,用于处理 GUI 相关的操作。在该方法中,从主相机向鼠标位置发射一条射线,如果命中当前脚本所挂载的物体,并且鼠标滚轮有滚动操作,则根据滚动值更新物体的缩放比例。Update方法:每帧都会调用,用于处理物体的旋转操作。当鼠标左键按下时,记录初始位置和上一位置;当鼠标左键持续按下时,计算偏移量并旋转物体;当鼠标左键释放时,计算最终偏移量并标记为滑动状态;在滑动状态下,继续旋转物体并逐渐减小旋转角度。
通过以上代码和解释,你可以在 Unity3D 中实现单个物体的缩放和旋转功能。