转载:http://blog.csdn.net/hiramtan/article/details/9020469
关于3D坐标系转换详细资料地址:http://blog.csdn.net/hiramtan/article/details/9020419
Unity3D 中使用鼠标,或触屏设备手指拖拽物体移动,先介绍第一种方法:
- using UnityEngine;
- using System.Collections;
- public class Drag : MonoBehaviour
- {
- // Use this for initialization
- void Start() {
- }
- // Update is called once per frame
- void Update() {
- }
- 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();
- }
- }
- }
using UnityEngine;
using System.Collections;
public class Drag : MonoBehaviour
{
// Use this for initialization
void Start() {
}
// Update is called once per frame
void Update() {
}
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();
}
}
}
使用这种方法成功运行,但是查看官方开发文档,如下:
- IMPORTANT: This function has no effect on iPhone.
IMPORTANT: This function has no effect on iPhone.
这个方法并不能用在iPhone中,下面介绍第二种方法:
- using UnityEngine;
- using System.Collections;
- /// <summary>
- /// Common property of player
- /// </summary>
- public class PlayerBase : MonoBehaviour
- {
- // Use this for initialization
- void Start() {
- }
- bool isBeDraged = false;
- RaycastHit hit;
- // Update is called once per frame
- void Update()
- {
- if (Input.GetMouseButton(0))
- {
- Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- if ((Physics.Raycast(ray, out hit)) && (null != hit.collider))
- isBeDraged = true;
- if (isBeDraged)
- {
- //Vector3 currentPostiont = Input.mousePosition;需要坐标系转换才能使用鼠标坐标,具体见本篇开头坐标系转换链接
- Vector3 currentPostiont = new Vector3(ray.origin.x, ray.origin.y, transform.position.z);
- transform.position = currentPostiont;
- }
- }
- else
- isBeDraged = false;
- }
- }
using UnityEngine;
using System.Collections;
/// <summary>
/// Common property of player
/// </summary>
public class PlayerBase : MonoBehaviour
{
// Use this for initialization
void Start() {
}
bool isBeDraged = false;
RaycastHit hit;
// Update is called once per frame
void Update()
{
if (Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if ((Physics.Raycast(ray, out hit)) && (null != hit.collider))
isBeDraged = true;
if (isBeDraged)
{
//Vector3 currentPostiont = Input.mousePosition;需要坐标系转换才能使用鼠标坐标,具体见本篇开头坐标系转换链接
Vector3 currentPostiont = new Vector3(ray.origin.x, ray.origin.y, transform.position.z);
transform.position = currentPostiont;
}
}
else
isBeDraged = false;
}
}
需要注意的是鼠标坐标需经过转换后才能使用.运行测试,能够成功运行.
如有任何建议请发邮件至hiramtan@qq.com