2015-11-03 21:13:31 VioletTD 阅读数 2320
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4707 人正在学习 去看看 张刚

   今天向大家介绍一下,如何初步的用Unity3D从摄像机到鼠标的射线,也就是鼠标检测到Unity3D世界中的游戏对象!

       如何才能使射线检测到游戏对象呢,只有一个条件,那就是必须添加collider组件,否则你是绝度检测不到,你想要检测的物体的!

       如果你还是检测不到Unity3D世界里的游戏对象的话! 真相只有一个"你没有在Update里调用该方法"!

       好了,到了代码的部分的,请大家指教,哈哈哈哈哈哈哈!
using UnityEngine;
using System.Collections;
/// <summary>
/// 功能:数遍检测寻找Unity3D世界里的游戏对象
/// 创建者: VioletTD
/// 创建时间:2015年11月3日 21:28
/// 感谢: Me加油!!
/// </summary>
public class RayToFindTest : MonoBehaviour {//射线查找的测试脚本

	void Update () {
		RayToFindMethod ("Player");//
	}
	void RayToFindMethod(string tags)//定义一个私有的,无返回值,有参数的方法  参数为你想找到的游戏对象的标签(Tag)
	{
		Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);//实例化从摄像机到鼠标的摄像
		RaycastHit hit;//这个为射线命中的点
		if (Physics.Raycast (ray,out hit)) {//物理静态类中的光线投射方法 ->  意义:射线投射出  "得到射线命中的点(hit)"
			if (hit.transform.CompareTag(tags)) {//如果射线命中的点的标签(Tag)值为 tags -> 即:外部传入的参数(你想要找到的游戏对象的标签)  并把hit射线命中的点的类型转换为transform类型
				Debug.Log (hit.transform.name);//为真执行输出射线命中点的名字
			}
		}
	}
}

         谢谢大家的支持和鼓励!


2019-12-18 15:18:27 weixin_44390521 阅读数 16
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4707 人正在学习 去看看 张刚

1. 基本原理
从相机发射一条射线到屏幕的鼠标位置,通过射线检测要抓取得物体
2. 类
(1)Camera : 相机组件
(2)Ray : 射线
(3)Physics.Raycast : 射线反射,碰到三维物体,返回True
(4)Input : 输入组件
3.实现代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class capture : MonoBehaviour {

    private static Camera cam;   
    private static Ray ray ;
    private static RaycastHit hit;
    // Use this for initialization
    void Start () {
        //获取相机组件
        cam = gameObject.GetComponent<Camera>();   
    }
	
	// Update is called once per frame
	void Update () {
        // 判断鼠标左键是否按下
        if (Input.GetMouseButton(0))   
        {
            // 创建一条从相机到鼠标点的射线
            ray = cam.ScreenPointToRay(Input.mousePosition);
            // 判断射线是否击中三维物体
            if (Physics.Raycast(ray,out hit))   
            {
                // 将被击中物体的世界坐标转换为屏幕坐标,目的是获取z位置,因为屏幕坐标只有x,y
                Vector3 hit_object_p = cam.WorldToScreenPoint(hit.collider.transform.position);
                //屏幕坐标转为世界坐标
                Vector3 p = cam.ScreenToWorldPoint(new Vector3
                    (Input.mousePosition.x,
                    Input.mousePosition.y,
                    hit_object_p.z)
                );
                //设置抓取物体的新位置
                hit.collider.transform.position = p;             
            }
        }
	}
}
2017-04-06 16:23:21 SYSUJackJiao 阅读数 11764
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4707 人正在学习 去看看 张刚

一、鼠标拾取物体的原理

Unity3D当中,想要在观察面(Aspect)中拾取物体(有碰撞属性)的方法一般如下:

1、声明一个观察的摄像机、一个从摄像机原点出发的射线Ray以及一个用于检测碰撞的RaycastHit;

2、将射线Ray定义为从摄像机原点出发并且指向当前鼠标所在的坐标(屏幕坐标);

3、定义碰撞RaycastHit为射线Ray与有碰撞属性的物体的碰撞点。

具体代码实现如下(C#代码):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class camera : MonoBehaviour
{
    public Camera ca;
    private Ray ra;
    private RaycastHit hit;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
            ra = ca.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ra, out hit))
            {  
                     
            }
    }
}
应用一:当鼠标按住不动时,移动被选定物体随鼠标一起移动
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class camera : MonoBehaviour
{
    public Camera ca;
    private Ray ra;
    private RaycastHit hit;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            ra = ca.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ra, out hit))
            {
                hit.collider.gameObject.transform.position = ca.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, hit.collider.gameObject.transform.position.z));
            }
        }
    }
}
应用二:当鼠标点击物体时,物体随鼠标一起移动;当鼠标再次点击时,放下物体。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class camera : MonoBehaviour {
    public Camera ca;
    private Ray ra;
    private RaycastHit hit;
    private int flag = 0;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            ra = ca.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ra, out hit))
            {
               if (flag == 0)
                {
                    flag = 1;
                } else
                {
                    flag = 0;
                }
            }
        }
        if (flag == 1)
        {
            hit.collider.gameObject.transform.position = ca.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, hit.collider.gameObject.transform.position.z));
        }

	}
}


2017-03-03 18:14:10 Truck_Truck 阅读数 2170
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4707 人正在学习 去看看 张刚

前几天项目中需要一个检测鼠标滑动停止的事件,发现Unity中没有,只有拖动停止等事件,所以在这里上传一个,如果有问题希望大神能指教一下。

  private Action onScrollFinish;

    private bool isScroll = false;

    private bool isStartCoroutine = false;

	// Use this for initialization
	void Start () {
        onScrollFinish += () => { Debug.Log("滚动结束"); };
    }
	
	// Update is called once per frame
	void Update () {    
        if (Input.GetAxis("Mouse ScrollWheel") != 0f)
        {
            isScroll = true;
            if (isStartCoroutine==false)
            {
                StartCoroutine("checkScroll");
                isStartCoroutine = true;
            }
        }
	}

    IEnumerator checkScroll()
    {
        while (true)
        {
            if (isScroll)
            {
                isScroll = false;
            }
            else
            {
                if (onScrollFinish != null)
                {
                    onScrollFinish(); 
                }
                StopCoroutine("checkScroll");
                isStartCoroutine = false;
                isScroll = false;
            }

            yield return new WaitForSeconds(0.2f);
        }
    }

可以在start中注册你的滚动结束事件出发时想要调用的方法。
这个方法是在update中实时监测滚轮是否滑动,当Input.GetAxis("Mouse ScrollWheel") != 0时表示鼠标正在滑动, 等待0.2秒是为了延迟一下等待鼠标停止时update
检测。

2016-05-10 18:53:40 Gary_888 阅读数 1379
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4707 人正在学习 去看看 张刚

Unity3D射线检测控制转向,使用Ray射线检测鼠标的位置信息,角色transform方向转向该位置。

//控制转向
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hitInfo;//碰撞信息,用来获取从raycast函数中得到的信息反馈的结构
        if (Physics.Raycast(ray, out hitInfo, 200, groundLayerIndex))//检测射线,控制转向
        {
            Vector3 target = hitInfo.point;
            target.y = transform.position.y;
            transform.LookAt(target);
        }

Unity3D射线

阅读数 263

没有更多推荐了,返回首页