您的位置:首页 > 移动开发 > Unity3D

Unity入门操作_射线_016

2017-08-22 20:15 477 查看
在3D游戏中,呈现给玩家的始终是一个2D的平面,那么如何使用鼠标来完成和游戏之间的交互便成为了一个值得思考的问题,如何将一个由鼠标选择的2D平面的点来映射到3D世界之中。

由于以上存在的问题,那么射线原理就有了其用武之地。首先究竟什么是射线原理,顾名思义,在射线原理中存在一条射线来定义鼠标映射在3D世界中的点。以摄像机为射线发出的原点,以鼠标的位置为目标点,在这两点之间发射一条射线,最后得到射线的终点,这个点就是鼠标位置映射在3D世界中的点。

运用射线原理可以完成很多操作,譬如红警当中建筑物的构建,选中建筑,点击地面建造(红警当然不是unity3D来编写的,这里只是打个比方,下同);DOTA里点击地面人物向点击处移动;还有像一些逃生类游戏拾取物品类的操作都可以使用射线原理来完成。

Vector3 v = Camera.main.ScreenToWorldPoint(用鼠标控制对象在游戏界面移动)(Input.mousePosition);

transform.position = new Vector3(v.x ,5,v.z);

RaycastHit

Physics.Raycast

射线可以分层访问

using UnityEngine;

using System.Collections;

public class RayTest : MonoBehaviour {

private CharacterController m_CharacterController;
private Vector3 target;
// Use this for initialization
void Start () {
m_CharacterController = GetComponent<CharacterController>();
target = transform.position;
//测试代码Debug.Log(GameObject.Find("PlaneGreen").layer);
}
// Update is called once per frame
void Update () {
Ray ray = Camera.main.ScreenPointToRay(射线位置)(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray,out hit,100,1<<8 | 1<<9))
{
if (Input.GetMouseButtonDown(0) /*&& LayerMask.NameToLayer("Green") == hit.collider.gameObject.layer*/)
{
//m_CharacterController.Move( hit.point + new Vector3(0,1,0) - transform.position);
//transform.position = Vector3.MoveTowards(transform.position, hit.point + new Vector3(0, 1, 0), 0.3f);
target = hit.point + new Vector3(0, 1, 0);
}
}
transform.position = Vector3.Lerp(transform.position, target, 0.1f);
transform.LookAt(target);
}


}

using UnityEngine;

using System.Collections;

public Transform to;
public float speed = 5F;
private GameObject play;
// Use this for initialization
void Start () {

play = GameObject.Find("person");
to = GameObject.Find("To_rotation").transform;
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;

if (Physics.Raycast(ray, out hit, 100))
{

if (hit.collider.gameObject.name == "floor")
{
Debug.Log(hit.point);
//点击地面后解除to的父子关系;并让我lookat目标点;
to.transform.parent = null;
to.LookAt(hit.point);
}
}
}
//如果我们的play 的旋转角度与to的角度相同,则恢复其父子关系,并将其坐标归零
if (play.transform.rotation == to.rotation)
{
to.transform.parent = play.transform;
to.transform.localPosition = new Vector3(0, 0, 0);
}
else
//如果play  与to的角度不同,则旋转play至to所在的角度
play.transform.rotation = Quaternion.Slerp(play.transform.rotation, to.rotation, speed);
}


}

PS: 射线条件:被照射的对象必须要有Collider且不是Collider2D!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 对象 鼠标 移动