Unity3D教程:物体跟随鼠标点击处移动
unity3d用鼠标控制

* 用到了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:"+);//若鼠标左键一直按着则循环继续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:" + );//对象原始角度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;}#endregionlast2Angle = 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); }。
Unity实现鼠标拖动3D物体

Unity实现⿏标拖动3D物体这篇博客实现⼀个⼩功能,通过⿏标拖动3D物体。
我们知道,如果是拖动 UIUG 的控件的话,它是有接⼝可以使⽤的。
但是3D物体就没有可直接使⽤的接⼝(或者说我没找到?),就需要我们⾃⼰写代码。
既然如此,那我们就来实现以下这个功能。
⾸先先创建⼀个这样的场景创建两个 cube 只是为了看清效果。
然后给摄像机添加⼀个 DragObject 脚本using UnityEngine;using System.Collections;public class DragObject : MonoBehaviour {/// <summary>/// 将要拖动的物体/// </summary>private Transform dragGameObject;/// <summary>/// 获取射线需要碰撞的层/// </summary>private LayerMask canDrag;/// <summary>/// 直接从外部定义好层,简单理解/// </summary>public LayerMask canDrag2;/// <summary>/// 获得⿏标的位置和cube位置差/// </summary>private Vector3 offset;/// <summary>/// 是否点击到cube/// </summary>private bool isClickCube;/// <summary>/// ⽬标对象的屏幕坐标/// </summary>private Vector3 targetScreenPoint;// Use this for initializationvoid Start () {// LayerMask.GetMask("Cube"); 得到名字为 Cube 的层的 2 进制// yerToName(9); 得到⼀个 10 进制表⽰的层的名字这⾥既第⼗层// ToLayer("Cube"); 得到名字为 Cube 的层的 10 进制//使⽤位运算,因为 LayerMask (好像)是以2进制存储的 Layer 的层是以0开始canDrag = 1 << ToLayer("Cube");}// Update is called once per framevoid Update () {if (Input.GetMouseButtonDown(0)){if (CheckGameObject()){offset = dragGameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetScreenPoint.z)); }}if (isClickCube){//当前⿏标所在的屏幕坐标Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetScreenPoint.z);//把当前⿏标的屏幕坐标转换成世界坐标Vector3 curWorldPoint = Camera.main.ScreenToWorldPoint(curScreenPoint);dragGameObject.position = curWorldPoint + offset;}if (Input.GetMouseButtonUp(0)){isClickCube = false;}}/// <summary>/// 检查是否点击到cbue/// </summary>/// <returns></returns>bool CheckGameObject (){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hitInfo;if (Physics.Raycast(ray, out hitInfo, 100f, canDrag)){isClickCube = true;//得到射线碰撞到的物体dragGameObject = hitInfo.collider.gameObject.transform;targetScreenPoint = Camera.main.WorldToScreenPoint(dragGameObject.position);return true;}return false;}}添加此脚本后运⾏,就能成功看见效果。
Unity3D中实现点击地面物体移动到指定地点

在Unity3D中实现点击地面物体移动到指定地点1.首先在场景中新建一个Plane和一个Cube,找两张不同的贴图(方便区分Plane和Cube),并把图片导入到工程中,将贴图分别拖曳至Plane上和Cube 上,并将摄像机调到合适的位置。
使摄像机俯视Plane。
调节好的Game视图如图1-1所示,文章出处【狗刨学习网】:图1-12.新建C#脚本,命名为Pathfinding1,双击脚本进行编辑,代码如下:using UnityEngine;using System.Collections;public class Pathfinding1 : MonoBehaviour {public GameObject play;public Vector3 temPos;public bool isMoving;public Quaternion rotation;// Use this for initializationvoid Start () {play = GameObject.Find("Cube");print(play);}// Update is called once per framevoid Update () {if(Input.GetMouseButtonDown(0)){//LayerMask mask = ToLayer("Ground");Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit, 100)){print ();if(=="Plane"){Debug.Log(hit.point);temPos = new Vector3(hit.point.x, play.transform.position.y, hit.point.z);if(Vector3.Distance(play.transform.position,temPos) > 0.1){isMoving = true;}}}}if(Vector3.Distance(play.transform.position,temPos) <= 0.1){isMoving = false;}if(isMoving){turn(temPos);this.GetComponent<CharacterController>().SimpleMove((temPos-play.transf orm.position).normalized*5f);}}void turn(Vector3 look){rotation = Quaternion.LookRotation (temPos-play.transform.position,Vector3.up);play.transform.rotation = Quaternion.Slerp(play.transform.rotation, rotation,Time.deltaTime*6.0f);}}3.将代码拖曳到创建的Cube上,给Cube添加CharacterController组件,点击播放,即可实现点击地面,物体跟随移动到哪里。
Unity3d C#脚本 实现鼠标拖动物体

Unity3d C#脚本实现鼠标拖动物体using UnityEngine;using System.Collections;public class clickmove : MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}//下面的函数是当鼠标触碰到碰撞体或者刚体时调用,我的碰撞体设置是mesh collider,然后别忘了,给这个collider添加物理材质//值得注意的是世界坐标系转化为屏幕坐标系,Z轴是不变的IEnumerator OnMouseDown(){//将物体由世界坐标系转化为屏幕坐标系,由vector3 结构体变量ScreenSpace存储,以用来明确屏幕坐标系Z轴的位置Vector3 ScreenSpace = Camera.main.WorldToScreenPoint(transform.position);//完成了两个步骤,1由于鼠标的坐标系是2维的,需要转化成3维的世界坐标系,2只有三维的情况下才能来计算鼠标位置与物体的距离,offset即是距离Vector3 offset = transform.position-Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,ScreenSpace.z));Debug.Log("down");//当鼠标左键按下时while(Input.GetMouseButton(0)){//得到现在鼠标的2维坐标系位置Vector3 curScreenSpace = new Vector3(Input.mousePosition.x,Input.mousePosition.y,ScreenSpace.z);//将当前鼠标的2维位置转化成三维的位置,再加上鼠标的移动量Vector3 CurPosition = Camera.main.ScreenToWorldPoint(curScreenSpace)+offset;//CurPosition就是物体应该的移动向量赋给transform的position属性transform.position = CurPosition;//这个很主要yield return new WaitForFixedUpdate();}}}。
unity3D——键盘鼠标的操作说明

unity3D键盘鼠标的操作键盘:GetKey 当通过名称指定的按键被用户按住时返回trueGetKeyDown 当用户按下指定名称的按键时的那一帧返回true。
GetKeyUp 在用户释放给定名字的按键的那一帧返回true。
GetAxis(“Horizontal")和GetAxis(“Verical”) 用方向键或WASD键来模拟-1到1的平滑输入键盘判断:If(Input.GetKeyDown(KeyCode.A)){//KeyCode表示包含键盘所有键print(“按下A键”);}If(Input.GetKeyUp(KeyCode.D)){//当按D键松开时print(“松开D键”);}If(Input.GetAxis(“Horizontal")){//当按下水平键时print(“按下水平键”);}If(Input.GetKeyUp("Verical“)){当按下垂直键时print(“按下垂直键”);}鼠标:GetButton 根据按钮名称返回true当对应的虚拟按钮被按住时。
GetButtonDown 在给定名称的虚拟按钮被按下的那一帧返回true。
GetButtonUp 在用户释放指定名称的虚拟按钮时返回true。
鼠标判断:if(Input.GetButton("Fire1")){//Fire1表示按下鼠标左键print(“按下鼠标左键”);}if (Input.GetMouseButton(0)) {//0表示鼠标左键Debug.Log("按下鼠标左键");}if (Input.GetMouseButton(1)) {//1表示鼠标右键Debug.Log("按下鼠标右键");}if (Input.GetMouseButton(2)) {//2表示鼠标中键Debug.Log("按下鼠标中键");}给物体施加普通力:1、先给物体添加刚体2、transform.rigidbody.AddForce(0,0,1000); 一个简单例子让小球撞破墙:代码如下:using UnityEngine;using System.Collections;public class Cube : MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {if(Input.GetKey(KeyCode.W)){//当鼠标按下W键时,小球向前移动transform.Translate(Vector3.forward);}if(Input.GetKey(KeyCode.S)){当鼠标按下S键时,小球向后移动transform.Translate(Vector3.back);}if(Input.GetKey(KeyCode.A)){当鼠标按下A键时,小球向左移动transform.Translate(Vector3.left);}if(Input.GetKey(KeyCode.D)){当鼠标按下D键时,小球向右移动transform.Translate(Vector3.right);}if(Input.GetButton("Fire1")){//当点击鼠标左键时,小球撞塌墙transform.rigidbody.AddForce(0,0,200);//物体向前移动的力为200 }}}想了解更多到狗刨学习网。
Unity3D第二课之通过键盘、鼠标移动物体

Unity3D第 二 课 之 通 过 键 盘 、 鼠 标 移 动 物 体
public class xuanzhuan : MonoBehaviour {
//平移速度变量 public float MoveSpeed;// Use this for initialization void Start () {
if(Camera.main.orthographicSize<=20) Camera.main.orthographicSize +=0.5F;
} //Zoom in if (Input.GetAxis("Mouse ScrollWheel") > 0) {
if(Camera.main.fieldOfView>2) Camera.main.fieldOfView-=2;
transform.Translate(Vector3.right* MoveSpeed,Space.World); } if(Input.GetKey(KeyCode.W)){
transform.Translate(Vector3.up* MoveSpeed,Space.World); } if(Input.GetKey(KeyCode.S)){
if(Camera.main.orthographicSize>=1) Camera.main.orthographicSize-=0.5F;
}
} }
transform.Translate(Vector3.பைடு நூலகம்own* MoveSpeed,Space.World); }
Unity3D控制物体移动、旋转、缩放

Unity3D控制物体移动、旋转、缩放转载⾃原⽂地址:Transform基本移动函数:1.指定⽅向移动://移动速度float TranslateSpeed = 10f;//Vector3.forward 表⽰“向前”transform.Translate(Vector3.forward *TranslateSpeed);2.全⽅向移动://x轴移动速度移动速度float xSpeed = -5f;//z轴移动速度移动速度float zSpeed = 10f;//向x轴移动xSpeed,同时想z轴移动zSpeed,y轴不动transform.Translate(xSpeed,0,zSpeed);3.重置坐标://x轴坐标float xPostion = -5f;//z轴坐标float zPostion = 10f;//直接将当前物体移动到x轴为xPostion,y轴为0,z轴为zPostion的三维空间位置。
transform.position = Vector3(xPostion,0,zPostion);输⼊控制:1.输⼊指定按键://按下键盘“上⽅向键”if(Input.GetKey ("up")) print("Up!");//按下键盘“W键”if(Input.GetKey(KeyCode.W);) print("W!");2.⿏标控制//按下⿏标左键(0对应左键, 1对应右键, 2对应中键)if(Input.GetMouseButton(0)) print("Mouse Down!");Input.GetAxis("Mouse X");//⿏标横向增量(横向移动)Input.GetAxis("Mouse Y");//⿏标纵向增量(纵向移动)3.获取轴://⽔平轴/垂直轴 (控制器和键盘输⼊时此值范围在-1到1之间)Input.GetAxis("Horizontal");//横向Input.GetAxis ("Vertical");//纵向按住⿏标拖动物体旋转和⾃定义⾓度旋转物体:float speed = 100.0f;float x;float z;void Update () { if(Input.GetMouseButton(0)){//⿏标按着左键移动 y = Input.GetAxis("Mouse X") * Time.deltaTime * speed; x = Input.GetAxis("Mouse Y") * Time.deltaTime * speed; }else{ x = y = 0 ; } //旋转⾓度(增加) transform.Rotate(new Vector3(x,y,0)); /**---------------其它旋转⽅式----------------**/ //transform.Rotate(Vector3.up *Time.deltaTime * speed);//绕Y轴旋转 //⽤于平滑旋转⾄⾃定义⽬标 pinghuaxuanzhuan();}//平滑旋转⾄⾃定义⾓度void OnGUI(){ if(GUI.Button(Rect(Screen.width - 110,10,100,50),"set Rotation")){ //⾃定义⾓度 targetRotation = Quaternion.Euler(45.0f,45.0f,45.0f); // 直接设置旋转⾓度 //transform.rotation = targetRotation; // 平滑旋转⾄⽬标⾓度 iszhuan = true; }}bool iszhuan= false;Quaternion targetRotation;void pinghuaxuanzhuan(){ if(iszhuan){ transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 3); }}键盘控制物体缩放:float speed = 5.0f;float x;float z;void Update () {x = Input.GetAxis("Horizontal") * Time.deltaTime * speed; //⽔平z = Input.GetAxis("Vertical") * Time.deltaTime * speed; //垂直//"Fire1","Fine2","Fine3"映射到Ctrl,Alt,Cmd键和⿏标的三键或腰杆按钮。
unity3D技术之屏幕内跟随鼠标移动

由于是在屏幕内跟随鼠标移动,我们知道,在屏幕上鼠标位置的Z坐标的值为0,所以我们要将物体的位置坐标Z赋值给鼠标的Z;1using UnityEngine;2using System.Collections;34public class Follow: MonoBehaviour {5Vector3 world;//物体要移动到的位置(世界坐标系)6float moveSpeed=0;//物体移动速度78void Update(){9Vector3 targetposition=Camera.main.WorldToScreenPoint(th is.transform.position);//将物体的世界坐标转狗刨学习网换为屏幕坐标1011Vector3 mouseposition=Input.mousePosition;//鼠标在屏幕上的位置坐标1213if(Input.GetMouseButton(0)){14mouseposition.z=targetposition.z;1516//world=Camera.main.ScreenToWorldPoint(mous e position);//这种情况下会有穿透现象1718world.x=Camera.main.ScreenToWorldPoint(mou se position).x;19world.z=Camera.main.ScreenToWorldPoint(mou se position).z;20world.y=this.transform.postion.y;2122moveSpeed=3;23}2425if(this.transform.position==world){//如果物体移动到了鼠标指定的位置将移动速度设为026moveSpeed=0;27}2829this.transform.LookAt(world);//物体朝向鼠标对应的位置(此时的位置为世界坐标系)30this.transform.Translate(Vector3.forward*moveSpeed*Ti me.deltaTime);31}32}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Unity3D教程:物体跟随鼠标点击处移动
Posted on 2013年02月14日 by U3d / Unity3D 基础教程/被围观 429 次思路是运用射线。
建立一个场景,场景中有两个cube,一个相机。
给var cam赋予主相机,两个cube分别赋予一下两个脚本,运行场景,点击或拖拽鼠标就知道区别了。
具体如下:
var cam:Camera;
function Update () {
if(Input.GetMouseButton(0))//Down或Up
{
var ray =cam.ScreenPointToRay (Input.mousePosition);
var hit: RaycastHit;
if(Physics.Raycast(ray,hit))
{
if(hit.collider.gameObject.tag=="Finish")//射线碰撞到的物体标签
{transform.position=hit.point;
print(hit.point);//鼠标点击的坐标
}
}
}
点击鼠标,物体向鼠标点击处移动
var cam:Camera;
var zj:boolean;
var jiludian:Vector3;
function Start () {
jiludian=transform.position; //记录物体初始位置
zj=false;
}
function Update () {
if(Input.GetMouseButton(0))
{
var ray =cam.ScreenPointToRay (Input.mousePosition);
var hit: RaycastHit;
if(Physics.Raycast(ray,hit))
{
if( hit.collider.gameObject.tag=="Finish") //这里地面的标签是Finish,你可以自定义
//print(hit.point);//显示鼠标点击的坐标
jiludian=Vector3(hit.point.x,hit.point.y+0.5,hit.point.z);
zj=true;
}
}
}
if(zj==true)
{
var targetRotation=Quaternion.LookRotation (jiludian-
transform.position,Vector3.up); //求出与目标之间的角度
print(targetRotation);
transform.rotation
=Quaternion.Slerp(transform.rotation,targetRotation,Time.deltaTime * 5.0);//旋转之角度与目标对齐
transform.Translate(Vector3.forward*10*Time.deltaTime);
if((Vector3.Distance(transform.position,jiludian) <1.0))
{
//transform.position=jiludian;
transform.Translate(Vector3.forward*0); zj=false;
}
}
}。