Unity3D教程:物体跟随鼠标点击处移动

合集下载

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物体

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中实现点击地面物体移动到指定地点

在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#脚本 实现鼠标拖动物体

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——键盘鼠标的操作说明

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第二课之通过键盘、鼠标移动物体
本博客内容主要以学习研究和分享为主欢迎转载但未经作者同意必须保留此段声明且在文章页面明显位置给出原文链接否则保留追究法律责任的权利
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控制物体移动、旋转、缩放

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技术之屏幕内跟随鼠标移动

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}。

Unity3D中移动物体位置的几种方法

Unity3D中移动物体位置的几种方法

1. 简介在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。

2. 通过Transform组件移动物体Transform 组件用于描述物体在空间中的状态,它包括位置(position),旋转(rotation)和缩放(scale)。

其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position)。

2.1 Transform.Translate该方法可以将物体从当前位置,移动到指定位置,并且可以选择参照的坐标系。

当需要进行坐标系转换时,可以考虑使用该方法以省去转换坐标系的步骤。

public function Translate(translation: Vector3, relativeTo: Space = Space.Self): void;2.2 Vector3.Lerp, Vector3.Slerp,Vector3.MoveTowardsVector3 既可以表示三维空间中的一个点,也可以表示一个向量。

这三个方法均为插值方法,Lerp为线性插值,Slerp为球形插值,MoveTowards在Lerp的基础上增加了限制最大速度功能。

当需要从指定A点移动到B点时,可以考虑时候这些方法。

2.3 Vector3.SmoothDamp该方法是可以平滑的从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。

2.4 Transform.position有时重新赋值position能更快实现我们的目标。

3. 通过Rigidbody组件移动物体Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响,物体被碰撞后的击飞等等。

注意:关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。

3.1 Rigidbody.velocity设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。

unity3d游戏开发之史上最简单的鼠标点击控制人物走动实现

unity3d游戏开发之史上最简单的鼠标点击控制人物走动实现

unity3d游戏开发之史上最简单的鼠标点击控制人物走动实现Unity3D是一款非常强大的游戏开发引擎,用于开发2D和3D的游戏。

在Unity3D中,实现鼠标点击控制人物走动是一项非常基础的功能。

本文将介绍一种简单方法,使用C#脚本来实现鼠标点击控制人物走动。

首先,我们需要准备一个场景,场景里包含一个人物模型以及一些地面。

确保人物模型是有动画的,可以跑步动画。

接下来,创建一个空的游戏对象,命名为Player,将人物模型作为子对象放在Player对象下。

这样我们可以控制Player对象来移动人物模型。

然后,给人物模型添加一个脚本,我们称之为PlayerController。

在PlayerController脚本中,我们要实现鼠标点击控制人物走动的功能。

首先,我们需要在Start方法中获取到人物模型的Animator组件,以便控制人物的动画。

```csharpprivate Animator animator;void Start```接下来,在Update方法中,我们要检测鼠标是否点击了场景。

```csharpvoid Updateif (Input.GetMouseButtonDown(0))Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit))//获取鼠标点击的地面的坐标Vector3 targetPosition = hit.point;//计算人物需要移动的方向Vector3 moveDirection = targetPosition - transform.position;moveDirection.y = 0;//设置人物的朝向transform.rotation = Quaternion.LookRotation(moveDirection);//激活人物的跑步动画animator.SetFloat("Speed", 1f);//移动人物transform.Translate(moveDirection.normalized *Time.deltaTime * moveSpeed, Space.World);}}```在代码中的注释中,我们分别解释了每一步的操作。

Unity3D游戏开发之史上最简单的鼠标点击控制人物走动实现

Unity3D游戏开发之史上最简单的鼠标点击控制人物走动实现

今天呢,我们来一起实现一个在RPG中游戏中十分常见的功能该文章出自【狗刨学习网】,通过鼠标点击屏幕来控制人物的走动。

首先来说一下原理,当我们点击屏幕时,我们按照一定的方法,将屏幕上的二维坐标转化为三维坐标,然后我们从摄像机位置发射一条经过该点的射线,则这条射线与大地平面的交点,就是我们的目标位置。

那么确定了这个位置以后,我们需要做的就是让角色从原来的位置移动到这个位置,并在其间添加角色动画即可。

对于角色移动的问题,如果复杂点的画我们可能要计算移动的方向向量,并针对起点和终点进行插值计算来实现,这里我们选择一种相对简单的办法,在Unity3D中,有一个LookAt()方法,该方法可以使物体发生旋转,使其z轴始终指向目标物体。

再完成了旋转后,我们需要让物体沿着Z轴方向(forward)移动。

这样就实现了鼠标点击控制人物走动这一功能。

好了,下面我们来一起看今天的内容吧!首先创建一个场景,我们准备一个地形Terrain和平行光Direction Light,并拖入我们事先准备好的人物模型,如图:接下来为模型添加动画组件,并将动画的类型设置为Legacy模式,如图所示:我们设置默认的动画为idle,接下来,我们来编写脚本代码:∙using UnityEngine;∙using System.Collections;∙∙public class PeopleControl : MonoBehaviour {∙∙//目标点坐标∙private Vector3 mT argetPos;∙∙void Start ()∙{∙∙}∙∙void Update ()∙{∙ //按下鼠标右键时∙ if(Input.GetMouseButton(1))∙ {∙ //获取屏幕坐标∙ Vector3 mScreenPos=Input.mousePosition;∙ //定义射线∙ Ray mRay=Camera.main.ScreenPointToRay(mScreenPos);∙ RaycastHit mHit;∙ //判断射线是否击中地面∙ if(Physics.Raycast(mRay,out mHit))∙ {∙ if(mHit.collider.gameObject.tag=="Terrain")∙ {∙ //获取目标坐标∙ mT argetPos=mHit.point;∙ //让主角面朝目标坐标并向目标移动∙ transform.LookAt(mTargetPos);∙ //播放奔跑动画∙ transform.gameObject.GetComponent().Play("run"); ∙ transform.Translate(Vector3.forward * 0.5F);∙ }∙ }∙ }∙ //松开鼠标右键时∙ if(Input.GetMouseButtonUp(1))∙ {∙ transform.gameObject.GetComponent().Play("idle");∙ }∙}}将脚本绑定到角色上以后,我们就能看到下面的效果啦,哈哈:)这就是今天的内容啦,当然我们还需要解决的问题还有如何在控制人物走动的时候避免和其它物体发生碰撞,以及后续的优化问题,这些内容我们会在后面的文章中为大家解答,谢谢大家!。

Unity实现物体跟随鼠标移动

Unity实现物体跟随鼠标移动

Unity实现物体跟随⿏标移动本⽂实例为⼤家分享了Unity实现物体跟随⿏标移动的具体代码,供⼤家参考,具体内容如下相关函数Vector3.Lerp 线性插值C# => static Vector3 Lerp(Vector3 from, Vector3 to, float t);Vector3.MoveTpwards 移向C# => static function MoveTowards(current: Vector3, target: Vector3, maxDistanceDelta: float): Vector3;Vector3.SmoothDamp 平滑阻尼C# =>static Vector3 SmoothDamp(Vector3 current, Vector3 target, Vector3 currentVelocity, float smoothTime, float maxSpeed = Mathf.Infinity, float deltaTime = Time.deltaTime);着时间的推移,逐渐改变⼀个向量朝向预期的⽅向移动向量由⼀些像弹簧阻尼器函数平滑,这将⽤远不会超过,最常见的⽤途是跟随相机实现跟随⿏标运动public class Demo : MonoBehaviour {void Start () {}void Update () {// 此时的摄像机必须转换 2D摄像机来实现效果(即:摄像机属性Projection --> Orthographic)Vector3 dis = Camera.main.ScreenToWorldPoint(Input.mousePosition); //获取⿏标位置并转换成世界坐标dis.z = this.transform.position.z; //固定z轴this.transform.position = dis; //使物体跟随⿏标移动Debug.Log(dis); //输出变化的位置//使⽤Lerp⽅法实现这⾥的Time.deltaTime是指移动速度可以⾃⼰添加变量⽅便控制this.transform.position= Vector3.Lerp(this.transform.position,dis,Time.deltaTime);//使⽤MoveTowards⽅法实现,这个⽅法是匀速运动this.transform.position = Vector3.MoveTowards(this.transform.position, dis, Time.deltaTime);//使⽤SmoothDamp⽅式实现,给定时间可以获取到速度Vector3 speed = Vector3.zero;this.transform.position = Vector3.SmoothDamp(this.transform.position, dis,ref speed, 0.1f);Debug.Log(speed);}}根据⿏标点下位置移动物体:public class Move : MonoBehaviour{void Start(){}void Update(){if (Input.GetMouseButton(0)){//获取需要移动物体的世界转屏幕坐标Vector3 screenPos = Camera.main.WorldToScreenPoint(this.transform.position);//获取⿏标位置Vector3 mousePos = Input.mousePosition;//因为⿏标只有X,Y轴,所以要赋予给⿏标Z轴mousePos.z = screenPos.z;//把⿏标的屏幕坐标转换成世界坐标Vector3 worldPos = Camera.main.ScreenToWorldPoint(mousePos);//控制物体移动transform.position = worldPos;//刚体的⽅式//transform.GetComponent<Rigidbody>().MovePosition(worldPos);}}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

unity3d游戏物体跟着鼠标方向移动

unity3d游戏物体跟着鼠标方向移动

unity3d游戏物体跟着⿏标⽅向移动效果:当点击⿏标左键时,游戏对象会朝⿏标点击的⽅向移动,类似魔兽争霸⼀样。

思路:把⿏标的坐标转化成世界坐标(⿏标默认是屏幕坐标),然后当点击⿏标时,物体将朝着⿏标的世界坐标⽅向移动。

如果你看到这的话,最好先别往下看,⾃⼰按着这个思路试做⼀下,实在不⾏再看看我的哈~~~~1. var world:Vector3;2. var speed:float=0;//物体的移动速度3. function Update (){4. var screenpos=Camera.main.WorldToScreenPoint(transform.position);//物体的世界坐标转化成屏幕坐标5. var e:Vector3=Input.mousePosition;//⿏标的位置6. //当点击⿏标左键时7. if(Input.GetMouseButton(0)){8. e.z=screenpos.z;//1.因为⿏标的屏幕 Z 坐标的默认值是0,所以需要⼀个z坐标9. world=Camera.main.ScreenToWorldPoint(e);10. speed=1;11. }12. if(transform.position==world){13. speed=0;14. }else{15. animation.Play("walk");//这是我⾃⾝带的⼀个默认动画,你可以把它删了16. }17. transform.LookAt(world); //物体朝向⿏标18. transform.Translate(Vector3.forward*speed*Time.deltaTime);19.20. }当然,上⾯那个适合垂直平⾯,即摄像头垂直x-z平⾯,但⼀般游戏都不会垂直的。

如果不垂直的话,⽤上⾯⽅法可能就会出现类似游戏对象穿透地⾯的现象,所以我们得改⼀下代码。

unity使物体跟随路径点自动移动位置

unity使物体跟随路径点自动移动位置

unity使物体跟随路径点⾃动移动位置可以做全⾃动的动画,只要设置好路径点就可以了,private Transform[] ways1;//路径点的位置public Transform tagret;//移动的物体private int index1;private void Start(){ways1 = JieLine.instance.LuJing;index1 = 0;tagret.transform.gameObject.SetActive(false);}public void MoveToway1(){if (index1 > ways1.Length - 1) { return; }tagret.localPosition = Vector3.MoveTowards(tagret.localPosition, ways1[index1].localPosition, speed * Time.deltaTime);if (Vector3.Distance(ways1[index1].localPosition, tagret.localPosition) < 0.01f){index1++;if (index1 == ways1.Length){tagret.localPosition = ways1[index1 - 1].localPosition;}}}//多个位置移动的⽅法public void MoveToway1(Transform obj,Transform []way,ref int index1,float speed){if (index1 > ways1.Length - 1) { return; }obj.localPosition = Vector3.MoveTowards(obj.localPosition, ways1[index1].localPosition, speed * Time.deltaTime);if (Vector3.Distance(ways1[index1].localPosition, obj.localPosition) < 0.00001f){index1++;if (index1 == ways1.Length){obj.localPosition = ways1[index1 - 1].localPosition;}}}//单个位置移动的⽅法public void MoveToway1(Transform obj,Transform way,float speed){if (Vector3.Distance(way.localPosition, obj.localPosition) > 0.0001f){obj.localPosition = Vector3.MoveTowards(obj.localPosition, way.localPosition, speed * Time.deltaTime);}}//物体平滑旋转的⽅法public void MoveToway1(GameObject obj,Quaternion vector3,float speed){obj.transform.localRotation = Quaternion.Slerp(huizhuangang.transform.localRotation,vector3, speed * Time.deltaTime);}。

Unity实现移动物体到鼠标点击位置

Unity实现移动物体到鼠标点击位置

Unity实现移动物体到⿏标点击位置本⽂实例为⼤家分享了Unity实现移动物体到⿏标点击位置的具体代码,供⼤家参考,具体内容如下⽬的:移动物体到⿏标点击处屏幕所对应的空间位置,并使物体正对着点击的对象,不能倾斜。

⾸先,需要获取点击屏幕所对应的空间位置,这可以通过先获取屏幕坐标,然后转成空间坐标;也可以通过射线直接获取到空间位置。

其次,移动物体到⽬的地,可直接通过差值进⾏移动,使物体看向⽬标点,不能直接使⽤LookAt(),因为,该函数是使物体的前⽅⾯向⽬标点(即物体的forward指向由物体到⽬标点的向量,这可能使物体在X,Y,Z⽅向都产⽣旋转,也就产⽣了倾斜)。

当⽬标点和物体⾼度不⼀致时,⽐如站着的⼈,让他⾛向地⾯上某⼀位置,如果使⽤LookAt则可能会导致⼈歪着看向⽬标点,如下图所⽰,⽽通常我们想要的只是⼈⾯向物体的⽅向。

//物体的正⽅向只Z的⽅向,朝向点击处,够将模型时要调好using UnityEngine;using System.Collections;public class Move : MonoBehaviour {private Vector3 targetPos;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {if (Input.GetMouseButtonDown(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if(Physics.Raycast(ray,out hit,1000.0f)){targetPos = hit.point;}turnForward2(transform, targetPos);}//transform.LookAt(targetPos);transform.position = Vector3.Lerp(transform.position, targetPos, Time.deltaTime);}/// <summary>/// 直接⽤transform.LookAt(targetPos);当⽬标点和远点不在⼀个⾼度时,会使物体发⽣倾斜来看想⽬标点/// 该⽅法使物体朝向指向的⽅向,同时保持物体不倾斜,只绕y轴旋转⼀定⾓度/// </summary>/// <param name="origin"></param>/// <param name="target"></param>void turnForward(Transform origin,Vector3 target) {//Vector3 forward_dir = target - origin.position;//Quaternion rotate = Quaternion.FromToRotation(origin.forward, forward_dir);//float angle = rotate.eulerAngles.y;//origin.rotation *= rotate;//将原坐标和⽬的坐标映射到XOZ平⾯,从⽽过滤掉y轴⽅向的旋转的影响Vector3 t1 = new Vector3(origin.position.x, 0, origin.position.z);Vector3 t2 = new Vector3(target.x, 0, target.z);Vector3 forward_dir = t2-t1;Quaternion rotate = Quaternion.FromToRotation(origin.forward, forward_dir);float angle = rotate.eulerAngles.y;origin.rotation *= rotate;//实现旋转。

Unity3D实现在单击鼠标位置创建物体

Unity3D实现在单击鼠标位置创建物体

Unity3D实现在单击鼠标位置创建物体Posted on 2013年03月28日 by U3d / Unity3D脚本/插件/被围观 265 次Unity3D如何实现单击鼠标后在单击位置创建物体的功能?代码如下://比较实用的一段代码,单击鼠标并在单击位置创建物体的功能var distanceFromCamera : float;var go:GameObject;private var X : int;private var Y : int;function Update(){X = Input.mousePosition.x;Y = Input.mousePosition.y;if(Input.GetMouseButtonDown(0)){var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); cube.AddComponent(Rigidbody);cube.transform.position =camera.main.ScreenToWorldPoint(Vector3(X,Y,distanceFromCamera)); }}//这段代码是动态载入库中物体var distanceFromCamera : float;var cube : Transform;private var X : int;private var Y : int;private var clickP:Vector3;function Update(){X = Input.mousePosition.x;Y = Input.mousePosition.y;clickP= camera.main.ScreenToWorldPoint(Vector3(X,Y,distanceFromCamera)); if(Input.GetMouseButtonDown(0)){//此处的var不可省略,省略后虽效果不变,但似乎有其它问题、//static function Instantiate (original : Object, position : Vector3, rotation : Quaternion) : Objectvar cube = Instantiate(cube, clickP, Quaternion.identity);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;
}
}
}。

相关文档
最新文档