一、射线检测之基本使用
射线有一个起点,方向,可以无限长,也可以有长度。
既可以进行二维的检测,也可以进行三维的检测。
public class Player : MonoBehaviour
{
void Start ()
{
}
void Update ()
{
//+transform.forward是指在z轴加1米,因为射线碰到了自身,所以这里大概加了有一米左右
Ray ray = new Ray(transform.position+transform.forward,transform.forward);//创建射线 起点 方向
bool isCollider= Physics.Raycast(ray);//(做射线检测)返回一个布尔值,判断是否碰到物体
Debug.Log(isCollider);//这个只能得到是够碰撞到游戏物体
}
}
二、射线检测之重载方法
public class Player : MonoBehaviour
{
void Start ()
{
}
void Update ()
{
//+transform.forward是指在z轴加1米,因为射线碰到了自身,所以这里大概加了有一米左右
Ray ray = new Ray(transform.position+transform.forward,transform.forward);//创建射线 起点 方向
//bool isCollider= Physics.Raycast(ray);//(做射线检测)返回一个布尔值,判断是否碰到物体
//Raycast重载方法 每个方法都会返回一个bool值
//bool isCollider = Physics.Raycast(ray,1);//1是距离,通过距离指定射线检测的距离
RaycastHit hit;
//bool isCollider = Physics.Raycast(ray,out hit);//RaycastHit存储我们碰撞到的物体,碰撞位置
//Debug.Log(hit.collider);//获取碰撞到的碰撞器
//Debug.Log(hit.point);//获取碰撞到的位置
bool isCollider = Physics.Raycast(ray, Mathf.Infinity, LayerMask.GetMask("Enemy1","Enemy2"));//LayerMask.GetMask("Enemy1")这个是要指定的layer层去发生碰撞的,可以多个可以一个
Debug.Log(isCollider);//这个只能得到是够碰撞到游戏物体
}
}
关于2D射线检测和检测碰撞到所有物体
public class Player : MonoBehaviour
{
void Start ()
{
}
void Update ()
{
//+transform.forward是指在z轴加1米,因为射线碰到了自身,所以这里大概加了有一米左右
Ray ray = new Ray(transform.position+transform.forward,transform.forward);//创建射线 起点 方向
//bool isCollider= Physics.Raycast(ray);//(做射线检测)返回一个布尔值,判断是否碰到物体
//Raycast重载方法 每个方法都会返回一个bool值
//bool isCollider = Physics.Raycast(ray,1);//1是距离,通过距离指定射线检测的距离
RaycastHit hit;
//bool isCollider = Physics.Raycast(ray,out hit);//RaycastHit存储我们碰撞到的物体,碰撞位置
//Debug.Log(hit.collider);//获取碰撞到的碰撞器
//Debug.Log(hit.point);//获取碰撞到的位置
bool isCollider = Physics.Raycast(ray, Mathf.Infinity, LayerMask.GetMask("Enemy1","Enemy2"));//LayerMask.GetMask("Enemy1")这个是要指定的layer层去发生碰撞的,可以多个可以一个
Debug.Log(isCollider);//这个只能得到是够碰撞到游戏物体
//2D射线检测和检测碰撞到所有物体
//Physics2D.Raycast();确保添加2D的碰撞器
//Physics.RaycastAll();检测被碰撞到的所有物体,不加all的就检测刚开始碰撞到的(对此我有疑问?不知道是碰撞到第一个之后就不会检测到后来所有的)
}
}
三、通过拖拽的方式监听UGUI的事件
UGUI事件监听
1.拖拽
2.代码添加
3.通过实现接口
代码添加方式
public class UIEventManager : MonoBehaviour
{
public GameObject btnGameObject;
public GameObject sliderGameObject;
public GameObject dropDownGameObject;
public GameObject toggleGameObject;
void Start ()
{
btnGameObject.GetComponent<Button>().onClick.AddListener(this.ButtonOnClick);//监听器
sliderGameObject.GetComponent<Slider>().onValueChanged.AddListener(this.OnSliderChanged);
dropDownGameObject.GetComponent<Dropdown>().onValueChanged.AddListener(this.OnDropDownChanged);
toggleGameObject.GetComponent<Toggle>().onValueChanged.AddListener(this.OnToggleChanged);
}
void ButtonOnClick()
{
Debug.Log("ButtonOnClick");
}
void OnSliderChanged(float value)
{
Debug.Log("SliderChanged:"+value);
}
void OnDropDownChanged(Int32 value)
{
Debug.Log("OnDropDownChanged:" + value);
}
void OnToggleChanged(bool value)
{
Debug.Log("OnToggleChanged:" + value);
}
void Update ()
{
}
}
四、跟鼠标相关事件接口的实现
using UnityEngine.EventSystems;//接口所需的命名空间
//using UnityEngine.UI;老师说还要这个,但我试了一下,不用也行
public class UIEventManager2 : MonoBehaviour, IPointerDownHandler,IPointerClickHandler,IPointerUpHandler,IPointerEnterHandler,IPointerExitHandler
{
/// <summary>
/// 这个是鼠标点击
/// </summary>
/// <param name="eventData"></param>
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("OnPointerClick");
}
/// <summary>
/// 实现IPointerDownHandler接口的方法 这个是鼠标按下
/// 实现鼠标按下,触发方法(如果在Unity中取消RaycastTarget 就不能触发这个事件点击的方法了)
/// 这个事件监听是通过射线检测来实现的,所以要确保勾选
/// </summary>
/// <param name="eventData"></param>
public void OnPointerDown(PointerEventData eventData)
{
//throw new System.NotImplementedException();这个不要
Debug.Log("OnPointerDown");
}
/// <summary>
/// 这个是鼠标进入
/// </summary>
/// <param name="eventData"></param>
public void OnPointerEnter(PointerEventData eventData)
{
Debug.Log("OnPointerEnter");
}
/// <summary>
/// 这个是鼠标移出
/// </summary>
/// <param name="eventData"></param>
public void OnPointerExit(PointerEventData eventData)
{
Debug.Log("OnPointerExit");
}
/// <summary>
/// 这个是鼠标抬起
/// </summary>
/// <param name="eventData"></param>
public void OnPointerUp(PointerEventData eventData)
{
Debug.Log("OnPointerUp");
}
}
五、跟拖拽相关的事件接口的实现
using UnityEngine.EventSystems;//接口所需的命名空间
//using UnityEngine.UI;老师说还要这个,但我试了一下,不用也行
public class UIEventManager2 : MonoBehaviour, //IPointerDownHandler,IPointerClickHandler,IPointerUpHandler,IPointerEnterHandler,IPointerExitHandler,
IBeginDragHandler,IDragHandler,IEndDragHandler,IDropHandler//拖拽接口
{
/// <summary>
/// 开始拖拽
/// </summary>
/// <param name="eventData"></param>
public void OnBeginDrag(PointerEventData eventData)
{
Debug.Log("OnBeginDrag");
}
/// <summary>
/// 拖拽中
/// </summary>
/// <param name="eventData"></param>
public void OnDrag(PointerEventData eventData)
{
Debug.Log("OnDrag");
}
/// <summary>
/// 停止拖拽
/// </summary>
/// <param name="eventData"></param>
public void OnDrop(PointerEventData eventData)
{
Debug.Log("OnDrop");
}
/// <summary>
/// 结束拖拽是在停止拖拽后,如果鼠标还在控制的控件上会触发这个方法
/// </summary>
/// <param name="eventData"></param>
public void OnEndDrag(PointerEventData eventData)
{
Debug.Log("OnEndDrag");
}
/// <summary>
/// 这个是鼠标点击
/// </summary>
/// <param name="eventData"></param>
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("OnPointerClick");
}
/// <summary>
/// 实现IPointerDownHandler接口的方法 这个是鼠标按下
/// 实现鼠标按下,触发方法(如果在Unity中取消RaycastTarget 就不能触发这个事件点击的方法了)
/// 这个事件监听是通过射线检测来实现的,所以要确保勾选
/// </summary>
/// <param name="eventData"></param>
public void OnPointerDown(PointerEventData eventData)
{
//throw new System.NotImplementedException();这个不要
Debug.Log("OnPointerDown");
}
/// <summary>
/// 这个是鼠标进入
/// </summary>
/// <param name="eventData"></param>
public void OnPointerEnter(PointerEventData eventData)
{
Debug.Log("OnPointerEnter");
}
/// <summary>
/// 这个是鼠标移出
/// </summary>
/// <param name="eventData"></param>
public void OnPointerExit(PointerEventData eventData)
{
Debug.Log("OnPointerExit");
}
/// <summary>
/// 这个是鼠标抬起
/// </summary>
/// <param name="eventData"></param>
public void OnPointerUp(PointerEventData eventData)
{
Debug.Log("OnPointerUp");
}
}
六、如何通过WWW下载图片
www支持本地的,服务器,ftp 。
http:// http:// file:// ftp://
public class WWWTest : MonoBehaviour
{
public string url = "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2614374335,2032277970&fm=26&gp=0.jpg";
/// <summary>
/// 给材质指定从网上下下来的图片
/// </summary>
/// <returns></returns>
IEnumerator Start()
{
WWW www = new WWW(url);
yield return www;
Renderer renderer = GetComponent<Renderer>();
renderer.material.mainTexture = www.texture;
}
void Update ()
{
}
}
七、Touches触摸事件
input 里有个touches 可以当前触摸数量
通过GetTouch获取手指都在做什么
public class TouchesTest : MonoBehaviour
{
void Start ()
{
}
void Update ()
{
//获取触摸的数量
//Debug.Log(Input.touches.Length);
//把第一个手指的事件封装成一个Touch对象 可以通过对象获取手指的事件
if (Input.touches.Length>0)//先判断触摸事件是否为空
{
Touch touch1 = Input.touches[0];//第一个手指
//touch1.position;手指触摸的位置
//获取当前手指的状态
TouchPhase touchPhase = touch1.phase;
}
}
}