/*
* 用到了unity3d非常好的协同机制实现这一点,OnMouseDown事件表示鼠标已作了射线判断得到了对象。
* 拖拽时保持z轴不变,因为屏幕是xy二维的,空间是三维的。
* */
IEnumerator OnMouseDown ()
{
var camera = Camera.mainCamera;
if (camera) {
//转换对象到当前屏幕位置
Vector3 screenPosition = camera.WorldToScreenPoint (transform.position);
//鼠标屏幕坐标
Vector3 mScreenPosition=new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
//获得鼠标和对象之间的偏移量,拖拽时相机应该保持不动
Vector3 offset = transform.position - camera.ScreenToWorldPoint( mScreenPosition);
print ("drag starting:"+transform.name);
//若鼠标左键一直按着则循环继续
while (Input.GetMouseButton (0)) {
//鼠标屏幕上新位置
mScreenPosition = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPosition.z);
// 对象新坐标
transform.position=offset + camera.ScreenToWorldPoint (mScreenPosition);
//协同,等待下一帧继续
yield return new WaitForEndOfFrame ();
}
print ("drag compeleted");
}
}
/// <summary>
/// 跟随鼠标旋转物体,并判断手势滑动离开时的旋转方向顺时针还是逆时针,可作些模拟拖拽完成时减速度效果
/// </summary>
/// <returns>
/// A <see cref="IEnumerator"/>
/// </returns>
IEnumerator OnMouseDown ()
{
Camera camera = Camera.mainCamera;
if (camera) {
//一般指旋转物体的中心点或鼠标围绕某个旋转的中心
Vector3 relativePoint = camera.WorldToScreenPoint (transform.position);
//鼠标操作时只用x,y轴,计算时必须忽略z轴
relativePoint.z = 0;
//鼠标按下时的方向向量,作为拖拽起始参考向量
Vector3 relativeDirection = Input.mousePosition - relativePoint;
//手势滑动时旋转方向,1:顺时针,-1:逆时针
int flingDir = 1;
//最后倒数第二个方向的角度,用于比较最后旋转方向
float last2Angle =0;
print ("rotation starting:" + transform.name);
//对象原始角度
Vector3 originAngles = transform.eulerAngles;
Quaternion originRotation=transform.rotation;
//旋转总角度
float sumAngle = 0;
while (Input.GetMouseButton (0)) {
#region 当前旋转角度
Vector3 currentDirection = Input.mousePosition - relativePoint;
//0-180正角度,不适合拖拽旋转
//float currentAngle = Vector3.Angle (relativeDirection, currentDirection);
//有正负角度,可做鼠标跟随旋转角度
float currentSignAngle = SignAngle (relativeDirection, currentDirection);
#endregion
//离上次角度偏移量
float offsetAngle = currentSignAngle - last2Angle;
#region 判断方向
flingDir = currentSignAngle - last2Angle >= 0 ? 1 : -1;
#endregion
#region 总计正方向旋转角度
if (offsetAngle > 0) {
sumAngle += offsetAngle;
}
#endregion
last2Angle = currentSignAngle;
//print(offsetAngle+","+sumAngle);
print ("angle:" + currentSignAngle + ",fling:" + flingDir + ",sum:" + sumAngle);
//设置新的角度
transform.eulerAngles=originAngles+ originRotation*direction*currentSignAngle;
yield return new WaitForEndOfFrame ();
}
print ("rotation compeleted");
}
}
/// <summary>
/// Math.atan2(y2-y1,x2-x1)
/// </summary>
/// <param name="vector1">
/// A <see cref="Vector2"/>
/// </param>
/// <param name="vector2">
/// A <see cref="Vector2"/>
/// </param>
/// <returns>
/// A <see cref="System.Single"/>
/// </returns>
float SignAngle (Vector2 start, Vector2 end)
{
float num1 = (end.x * start.y)-(start.x * end.y);
float num2 = (start.x * end.x) + (start.y * end.y);
return (Mathf.Atan2 (num1, num2) * Mathf.Rad2Deg);
}
分享到:
相关推荐
在Unity3D游戏开发中,2D角色控制器是构建2D平台游戏的核心组件。"Unity3d 2D Character Controllers 官方资源"提供了一系列官方教程和资源,旨在帮助开发者创建具有完整交互功能的2D游戏角色。这个压缩包可能包含了...
"Unity3D鼠标点击地面特效Real-time Strategy FX v1.0"就是这样一个资源包,它提供了类似于《英雄联盟》中的鼠标点击地面时产生的视觉效果。 1. **特效系统**:Unity3D支持多种特效的创建,包括粒子系统、光照、...
在Unity中,可以使用`Input.mousePosition`来获取鼠标或触摸屏的位置,然后通过`Physics.Raycast()`或`Physics2D.Raycast()`函数来检测与之相交的3D物体。在Raycast设置中,你可以通过标签(tag)来区分不同的3D物体...
Unity3D 是一款强大的跨平台游戏开发引擎,广泛应用于创建2D和3D游戏、模拟器以及交互式体验。在本教程中,我们将探讨如何将鼠标的点击事件转换为触摸事件,以便在支持触摸输入的设备(如智能手机和平板电脑)上实现...
Unity3D是一款强大的跨平台游戏开发工具,尤其在2D和3D游戏开发领域有着广泛的应用。本示例是关于创建一个2D射击游戏,特别适合初学者进行学习和实践。下面将详细介绍在这个项目中涉及的关键知识点。 1. **2D游戏...
脚本是 Unity3D 中的程序代码,用于控制游戏对象的行为。在本教程中,我们将编写一个脚本来实现谷歌地球旋转效果。 二、谷歌地球旋转效果实现 ------------------------- ### 1. 初始化旋转矩阵 在 Awake 函数中...
* Unity 3D 简介: Unity3D是跨平台、功能强大的游戏引擎,支持2D、3D游戏开发。 * 创建游戏工程与界面介绍: Unity3D 提供了友好的界面,读者可以快速创建游戏工程,了解基本操作。 * 添加灯光、材质:灯光和材质是...
在Unity3D游戏开发中,改变鼠标的样式和设置光标形状是常见的需求,这有助于增强用户交互体验,尤其是在创建具有独特界面或者需要特定交互反馈的游戏时。在Unity中,可以使用内置的GUI系统或者Unity的图形渲染管线来...
在Unity3D 2D游戏开发中,常常需要找出与...总之,通过计算距离并遍历物体数组,我们可以找到Unity3D 2D场景中与指定对象(如鼠标位置)最近的物体。优化查找策略能进一步提升游戏性能,特别是在物体数量较大的情况下。
Unity3D是一款强大的跨平台游戏开发引擎,广泛用于制作2D和3D游戏、应用程序以及虚拟现实内容。在这个"Unity 判断鼠标悬浮在UI或3D物体上Demo"项目中,开发者实现了一种功能,使得游戏或应用可以精确地识别鼠标光标...
Unity3d是一款强大的跨平台游戏开发引擎,广泛用于制作2D和3D游戏以及互动式内容。UGUI(Unity Graphic User Interface)是Unity3d内置的UI系统,它提供了丰富的界面元素和事件处理机制,使得开发者能够轻松创建复杂...
Unity3D是一款强大的跨平台游戏开发引擎,广泛用于制作2D和3D的互动内容,包括游戏、模拟器以及各种视觉体验。在这个“unity3d 麻将”项目中,开发者利用Unity3D的技术来构建了一款麻将游戏,允许用户查看源代码,这...
Unity实现鼠标点2D转3D进行旋转 Unity是一款功能强大且广泛应用于游戏开发的游戏引擎,对于实现鼠标点2D转3D进行旋转的需求,Unity提供了多种方法和技术来实现这一功能。本文主要介绍了使用Unity实现鼠标点2D转3D...
Unity3D支持多种输入方式,包括键盘、鼠标、触摸屏等。开发者可能使用Input类来获取玩家的输入,并通过脚本逻辑处理这些输入,例如,当玩家按下射击键时,创建一个射线cast,检测并与游戏中的目标进行碰撞。 此外,...
Unity3D是一款强大的跨平台游戏开发引擎,广泛用于制作2D、3D游戏以及互动式体验。在"unity3D 第三人称控制"的主题中,我们将深入探讨如何在Unity3D环境中实现第三人称角色的控制机制。这涉及到游戏设计的核心元素,...
Unity是一款广泛使用的跨平台游戏开发引擎,它支持创建2D与3D游戏,并且拥有丰富的功能集,能够满足从独立开发者到大型工作室的各种需求。以下是对标题和描述中提到的关键知识点的详细阐述。 ### Unity 3D引擎简介 ...
unity3d中实现基本的铅笔,直线,画圆,画矩形和输入文字的功能,以及保存文件,打开文件的功能。其中计算直线夹角和判断鼠标是否在线上使用了NN视频聊天组件的功能(免费哦,在Assets\Plugins目录下,聊天功能参考...
Unity3D的核心是强大的图形渲染能力,以及简单易用的开发环境,让开发者可以快速制作出高质量的2D和3D游戏和应用。此外,Unity3D还提供了一整套完善的工具链,包括场景编辑器、物理引擎、动画系统、脚本接口等,使得...
Unity3D是一款强大的跨平台游戏开发引擎,广泛用于制作2D和3D游戏、互动体验以及虚拟现实应用。在这个特定的项目中,我们探讨的是如何在Unity3D中实现一个画笔工具,允许用户进行涂鸦和签字。这个功能对于许多应用...
Unity3D是一款强大的跨平台游戏开发工具,尤其在2D和3D游戏制作领域有着广泛的应用。本教程“2DGameplayTutorialProject”旨在引导学习者掌握如何利用Unity3D来构建2D游戏。以下是对这个教程项目涉及的知识点的详细...