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 {
}
using UnityEngine;
using System.Collections;
}
PS: 射线条件:被照射的对象必须要有Collider且不是Collider2D!
由于以上存在的问题,那么射线原理就有了其用武之地。首先究竟什么是射线原理,顾名思义,在射线原理中存在一条射线来定义鼠标映射在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入门操作_生成有序图案_008
- Unity入门操作_UGUI_Slider_028
- Unity入门操作_粒子系统_034
- Unity入门操作_视频_036
- Unity_UGUI入门_016
- Unity入门操作_协程_023
- Unity入门操作_动画系统_Mecanim_032
- 【笨木头Unity】入门之旅009:Demo之四处找死(四)_在代码里操作物体
- Unity入门操作_ 规律移动_007
- Unity入门操作_刚体 _012
- Unity入门操作_ 脚本的含义_001
- Unity入门操作_Transform组件_003
- Unity入门操作_旋转_006
- Unity入门操作_碰撞器 _013
- Unity入门操作_动画系统_Legacy_031
- Unity入门操作_关节,布料_017
- Unity_Lua_VS环境下入门操作
- Unity入门操作_固定路线行走_021
- Unity入门操作_025_01
- Unity入门操作_UGUI_事件_030