【蓝鸥Unity开发基础三】课时18 射线【完结】

推荐视频讲师博客:http://11165165.blog.51cto.com/

一、射线

虚拟射线能够检测所碰撞到的物体

使用Physics类的Raycast方法实现射线碰撞检测功能

【蓝鸥Unity开发基础三】课时18 射线【完结】_第1张图片



回到Unity中我们来一个功能:

场景中有一个底面 一个Cube玩家,在3DRPG游戏中,可以通过鼠标的右键点击对面,来让玩家移动。

1、创建一个地面,拉大,然后用材质球染成绿色

2、接下来创建一个Cube,作为玩家,让Cube处于地面上,然后用材质球染成红色。

3、调整一下摄像机的视角

【蓝鸥Unity开发基础三】课时18 射线【完结】_第2张图片

 

4、然后为了能实现移动,我们需要对玩家Cube添加脚本PlayerController

5、在脚本中来实现功能

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour {

    /* 在场景中鼠标点击地面后,角色可以移动到目标位置 */

    public  float  speed;// 角色移动速度

    private Vector3 target;//目标位置

    private bool isOver=true;//移动施法结束

    void Update () {

        if(Input.GetMouseButtonDown(0)){
            //1、获取鼠标点击时的目标位置/目标点
            //使用射线实现

            //1、创建射线
            //从摄像机发射出一条经过鼠标当前位置的射线
            Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
            //2、发射射线
            RaycastHit hitInfo=new RaycastHit();
            if(Physics.Raycast(ray,out hitInfo)){
                //获取碰撞点位置
                if(hitInfo.collider.name=="Plane"){
                    target= hitInfo.point;
                    target.y = 0.5f;//地面上,不陷入地面
                    isOver=false;
                }
            } 
        }

        //2、让角色移动到目标位置
        MoveTo (target);
    }

    //让角色移动到目标位置
    private void MoveTo(Vector3 tar){
        if (!isOver) {
            Vector3 v1 = tar-transform.position;
            transform.position += v1.normalized *speed*Time.deltaTime;
            if(Vector3.Distance(tar,transform.position)<=0.1f){
                isOver=true;
                transform.position = tar;
            }
        } 
    }
}

6、设置speed 的值

 

【蓝鸥Unity开发基础三】课时18 射线【完结】_第3张图片

【蓝鸥Unity开发基础三】课时18 射线【完结】_第4张图片

 

【蓝鸥Unity开发基础三】课时18 射线【完结】_第5张图片