unity3d鼠标控制角色移动脚本 问题

一般看到的实现方法都是通过向目标点发出射线与平面相交获取坐标,请问:为什么不能直接获取坐标然后向目标点移动(u3d 有直接获取鼠标世界坐标的函数,获取后计算到该点的距离,然后transform.Translate过去不行吗?)

using UnityEngine;
using System.Collections;

public class characterContrlAndMouseContrl : MonoBehaviour {


public Vector3 weizhi;//鼠标点击地图的位置
public float speed  =2.0f;//移动速度
public Camera camera1;


// Use this for initialization
void Start () {
camera1 = GameObject.FindWithTag("MainCamera").camera;
animation.Play ("idle");
weizhi = transform.position;
animation["run"].speed=speed;//

}



// Update is called once per frame
void Update () {



//鼠标左键弹单击
if (Input.GetMouseButtonDown (0)) {
particle_instance ();//生成单击粒子


}
// transform.LookAt (ignoreY(weizhi));
//转方向
Character_zhuan (this.gameObject, weizhi);


//如果角色位置 比 鼠标点击地图的位置 距离大于 1
if (Vector3.Distance (ignoreY(transform.position), ignoreY(weizhi)) > 1) {

animation ["run"].speed = speed*0.3f;//
animation.Play ("run");

//移动角色
transform.Translate(Vector3.forward *  Time.deltaTime * speed);


} else {
animation.Play ("idle");
}
}

public GameObject particle; //鼠标点击位置的粒子
protected Object particleClone=null;  //鼠标点击位置的粒子克隆

//这个函数用来取消向量的Y轴影响,比如主角的高度与点之间可能有一段距离,我们要忽略这段距离
Vector3 ignoreY(Vector3 v3)
{
return new Vector3(v3.x, 0, v3.z);
}


//人物转方向函数,参数
void Character_zhuan(GameObject gameobj,Vector3 Vpoint)
{
//主角的朝向即为下一个点坐标减去主角坐标的向量
Vector3 direction = (ignoreY(Vpoint) - ignoreY(gameobj.transform.position)).normalized;
//插值改变主角的朝向,使其有一个自然转向的过程,防止其瞬间转向
gameobj.transform.forward = Vector3.Lerp(gameobj.transform.forward, direction, 0.1f);
}


/// <summary>
///击生成粒子 
/// </summary>
void particle_instance()
{

Ray ray = camera1.ScreenPointToRay (Input.mousePosition);
RaycastHit hit;


//当射线彭转到对象时
if (Physics.Raycast (ray, out hit)) {

//检测粒子是否为空
if (particleClone != null) {

GameObject.Destroy (particleClone);
particleClone = null;
}
//粒子实例化
Quaternion q1 = new Quaternion ();
q1.SetLookRotation (hit.normal, Vector3.forward);
particleClone = Instantiate (particle, hit.point, q1);
weizhi =hit.point;
}



}
}

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-01-27
你说的"直接获取鼠标世界坐标的函数"指的是屏幕转世界的函数ScreenToWorldPoint()还是指OnMouseDown()?
这两个函数的原理都是获取射线与平面的交点,原理都是一样的,ScreenToWorldPoint需要知道摄像机与地面的具体,俯视垂直摄像机还好说,斜视的话距离就是个变量,还是要获取射线与平面的交点.OnMouseDown()的原理也是射线检测,获取的是鼠标点击的collider
怎么看都是直接获取射线与平面的交点最简单,最符合常理,最好用的方法本回答被网友采纳

在unity3d中如何制作鼠标点击按钮,传送人物到目的地。菜鸟需要代码,急...
voidOnMouseDown(){Destroy(obj.gameObject);}可以尝试看看这个鼠标点击事件,放在脚本与update同级就可以了。新手,如果见解不当,请指正,多谢了。

求教Unity3d的EasyTouch插件的多点触控
控制角色移动播放动作或者其他逻辑则需要给这个橘色节点绑定逻辑脚本,UNity支持多种脚本语言,在此是用JAVA脚本.创建 脚本Assets --> Create ---> JavaScript 创建一个空的逻辑脚本,并将这个脚本绑定在主角对象身上,绑定方式是直接拖拽到主角节点即可。对脚本的编写:类及接口主要参照帮助文档,这里只介绍...

unity3D 里面第一人陈的mouselook的灵敏度怎么在代码里调低一点,每一次...
MouseLook这个脚本里面有一个 Sensitivity X 这个是控制左右转的, Y是控制上下转的,数值越小越慢

玩Unity3D游戏时,人物自动向左走(不是键盘问题),插件我也重新安装了,但...
是驱动的问题,我之前也是这样,花了2个多小时整理驱动,你看看你是否下了手柄相关的驱动,如果是把他禁用就好了,我之前下了一个Vjoy,后来就一直这样,禁用就好了

unity为什么人物为什么会滑动
因为脚本中的GetAxis函数。unity3D人物移动,运行之前的项目,小人可以自由移动,但是移动过程中,会有停止按键后滑动一段距离的效果,这是因为脚本中的GetAxis函数,他得到的值随着按键的过程而变化,所以每一次松开的时候,该值仍在变化,导致了多余的移动。

unity3d 移动逻辑写在哪里
点Ann component 点击后选择New script 然后起个名,创建 script 新建完后,会自动挂上你的对象,双击如图上的脚本 就会运行 visual studio 20xx 版本需要看你安装是多少就会调用多少的 然后就从这脚本里编辑相关的内容 unity是需要系统学习的,建议购书或参考视频学习,以上希望可以帮助到你 ...

【Unity3D】角色控制器(CharacterController)
在Unity3D中,角色通常通过脚本组件进行控制。为此,我们创建一个名为PlayerController的脚本组件,并将其挂载到角色的胶囊体上。PlayerController脚本包含角色移动、跳跃、攻击等行为逻辑的实现。完成上述步骤后,我们就可以运行游戏,体验角色在楼梯、斜坡上的灵活移动。通过调整CharacterController组件的参数,我们...

Unity3D 通过transform实现人物移动还是velocity详解
Unity3D游戏引擎提供了两种常见的角色移动方式:通过transform组件和velocity属性。transform组件控制对象位置、旋转和缩放,通过修改position属性实现移动。创建一个脚本,利用Input类获取玩家输入,根据水平和垂直方向调整Vector3的movement变量,再乘以moveSpeed和Time.deltaTime,更新transform.position,确保移动速度...

在Unity中做一个2D游戏,放入了两个按钮: "<" 和" >",想问如何通过点击这...
你可以先去【绘学霸】网站找“游戏特效\/unity3D”板块的【免费】视频教程-【点击进入】完整入门到精通视频教程列表: www.huixueba.net\/web\/AppWebClient\/AllCourseAndResourcePage?type=1&tagid=305,306&zdhhr-11y17r-1387492534481377620 想要系统的学习可以考虑报一个网络直播课,推荐CGWANG的网络课...

unity3d控制器脚本的问题!急!!!出现UnityException: Input Axis Vertial...
虽然问题过期了,但这个是正确的答案。是你的脚本里的拼写错误了。Input.GetAxis ("Horizontal")Input.GetAxis ("Vertical")你的Vertical 写错了 少了个c 字母

相似回答