Vuforia实现物体旋转、移动、缩放

完整的旋转脚本

  1. 创建一个新的C#脚本,命名为Spinning.cs。

在面板中点击Add component,找到New script 创建脚本

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Spinning : MonoBehaviour

{

private Vector2 pos1; // 声明向量,记录上一帧触点位置

private float speed = 0.3f; // 设置旋转速度

private void Update()

{

// 检查是否有触控输入

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

{

// 记录本帧触点位置

Vector2 newPos1 = Input.GetTouch(0).position;

// 计算旋转的向量

Vector3 vecR = new Vector3(0, pos1.x - newPos1.x, 0);

// 绕自身轴旋转

gameObject.transform.Rotate(vecR * speed, Space.Self);

// 更新触点位置

pos1 = newPos1;

}

else if (Input.touchCount > 0)

{

// 如果有触控输入,记录当前触点位置

pos1 = Input.GetTouch(0).position;

}

}

}

完整的缩放脚本

  1. 创建一个新的C#脚本,命名为Zoom.cs。

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Zoom : MonoBehaviour

{

// 声明两个向量,用于记录上一帧的两个触点位置

private Vector2 pos1;

private Vector2 pos2;

void Update()

{

// 检查是否有两个触控输入

if (Input.touchCount == 2)

{

// 检查两个触摸是否都在移动

if (Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved)

{

// 记录本帧中的两个触点位置

Vector2 newPos1 = Input.GetTouch(0).position;

Vector2 newPos2 = Input.GetTouch(1).position;

// 通过上一帧和本帧的触点距离变化判断是放大还是缩小操作

if (IsBigger(pos1, pos2, newPos1, newPos2))

{

// 放大

float oldScale = transform.localScale.x;

float newScale = oldScale * 1.025f; // 设置放大比例

transform.localScale = new Vector3(newScale, newScale, newScale);

}

else

{

// 缩小

float oldScale = transform.localScale.x;

float newScale = oldScale / 1.025f; // 调整缩小比例

transform.localScale = new Vector3(newScale, newScale, newScale);

}

// 更新触点位置

pos1 = newPos1;

pos2 = newPos2;

}

else

{

// 如果有两个触控输入,记录当前触点位置

pos1 = Input.GetTouch(0).position;

pos2 = Input.GetTouch(1).position;

}

}

}

// 判断是放大操作还是缩小操作

bool IsBigger(Vector2 oP1, Vector2 oP2, Vector2 nP1, Vector2 nP2)

{

float length1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));

float length2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));

return length1 < length2; // 如果新的距离比旧的距离大,返回true

}

}

完整的平移脚本

  1. 创建一个新的C#脚本,命名为Move.cs。

using UnityEngine;

public class Move : MonoBehaviour

{

// 声明向量,用于记录上一帧的位置

private Vector2 pos1;

private void Update()

{

// 检查是否有一个触控输入,并且触摸状态为移动

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

{

// 记录本帧触点位置

Vector2 newPos1 = Input.GetTouch(0).position;

// 判断触点是左移还是右移

int direction = IsLeft(pos1, newPos1);

// 根据触点的移动方向进行平移

if (direction == 2) // 右移

{

transform.position += new Vector3(0.02f, 0, 0); // 向右移动

}

else if (direction == 1) // 左移

{

transform.position -= new Vector3(0.02f, 0, 0); // 向左移动

}

// 更新上一帧触点位置

pos1 = newPos1;

}

else if (Input.touchCount > 0)

{

// 如果有触控输入,记录当前触点位置

pos1 = Input.GetTouch(0).position;

}

}

// 判定触点是左移还是右移

int IsLeft(Vector2 oP1, Vector2 nP1)

{

if (nP1.x - oP1.x > 0)

return 2; // 右移

else if (nP1.x - oP1.x < 0)

return 1; // 左移

else

return 0; // 没有移动

}

}

最后导出 APK ,安装

相关推荐
视+老张1 天前
戴上AR眼镜后,古建导览怎样把看建筑、听故事和继续走连成一条线?
ar·ar眼镜·增强现实·智慧景区·easyar
tealcwu2 天前
【Unity基础】为什么游戏需要物理按键映射?从 Unity Input Manager 到跨引擎输入设计
java·游戏·unity
tealcwu3 天前
【Unity高级】Unity URP:构建同时支持 2D 与 3D 场景的项目完全指南
3d·unity·游戏引擎
淡海水3 天前
10-01-互操作-C#与C++边界的内存管理
unity·c#·游戏引擎·.netcore·gc
小小数媒成员3 天前
UGUI原理(一)
开发语言·游戏·unity·游戏引擎
暴走约伯3 天前
【VFX工具链源码拆解 04】拯救丢失的绑定:Timeline 一键克隆与层级相对路径重映射算法
unity·c#·游戏引擎·硬件工程
小小数媒成员3 天前
Unity UGUI布局组件(LayoutGroup、ContentSizeFitter、LayoutElement)详解
unity·游戏引擎
tealcwu3 天前
【Unity基础】Unity输入与Time.deltaTime的使用原则
unity·游戏引擎
郝学胜-神的一滴4 天前
AI 编程智能体 22:解析器赋能与实战落地全指南
人工智能·程序人生·游戏·unity·游戏引擎
BuHuaX4 天前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua