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

一般看到的实现方法都是通过向目标点发出射线与平面相交获取坐标,请问:为什么不能直接获取坐标然后向目标点移动(u3d有直接获取鼠标世界坐标的函数,获取后计算到该点的距离,然... 一般看到的实现方法都是通过向目标点发出射线与平面相交获取坐标,请问:为什么不能直接获取坐标然后向目标点移动(u3d 有直接获取鼠标世界坐标的函数,获取后计算到该点的距离,然后transform.Translate过去不行吗?) 展开
 我来答
悠扬飞响
2014-01-25 · TA获得超过154个赞
知道答主
回答量:201
采纳率:100%
帮助的人:72.1万
展开全部
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;
}



}
}
正义King
2014-01-27 · TA获得超过2102个赞
知道小有建树答主
回答量:974
采纳率:94%
帮助的人:654万
展开全部
你说的"直接获取鼠标世界坐标的函数"指的是屏幕转世界的函数ScreenToWorldPoint()还是指OnMouseDown()?
这两个函数的原理都是获取射线与平面的交点,原理都是一样的,ScreenToWorldPoint需要知道摄像机与地面的具体,俯视垂直摄像机还好说,斜视的话距离就是个变量,还是要获取射线与平面的交点.OnMouseDown()的原理也是射线检测,获取的是鼠标点击的collider
怎么看都是直接获取射线与平面的交点最简单,最符合常理,最好用的方法
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式