2017-11-25 10:57:08 q764424567 阅读数 1102
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4645 人正在学习 去看看 张刚





unity 鼠标手势的左右滑动

using UnityEngine;  
using System.Collections;  

public class HeroModelRotate : MonoBehaviour  
{  
    /// <summary>  
    /// 第一次按下的位置  
    /// </summary>  
    private Vector2 first = Vector2.zero;  
    /// <summary>  
    /// 鼠标的拖拽位置(第二次的位置)  
    /// </summary>  
    private Vector2 second = Vector2.zero;  
    /// <summary>  
    /// 旋转的角度  
    /// </summary>  
    private float angle = 3f;  

    void OnGUI()  
    {  
        if (Event.current.type == EventType.MouseDown)  
        {  
            //记录鼠标按下的位置     
            first = Event.current.mousePosition;  
        }  
        if (Event.current.type == EventType.MouseDrag)  
        {  
            //记录鼠标拖动的位置     
            second = Event.current.mousePosition;  

            if (second.x < first.x)  
            {  
                //拖动的位置的x坐标比按下的位置的x坐标小时,响应向左事件     
                this.transform.Rotate(Vector3.up, angle);  
            }  
            if (second.x > first.x)  
            {  
                //拖动的位置的x坐标比按下的位置的x坐标大时,响应向右事件     
                this.transform.Rotate(Vector3.down, angle);  
            }  
            first = second;  
        }  
    }  
}  

2013-07-30 10:07:58 Vestigge 阅读数 8561
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4645 人正在学习 去看看 张刚

在用ngui做2d游戏时,做好的ui,在ui上点击时,人物也会随着点击移动,我们要做的就是在点击UI时,只响应UI的事件,点击非UI区域时才移动人物。

解决办法:采用射线,触摸屏幕的时候向触摸点发射一条射线,判断射线碰撞的物体是不是UI即可


首先需要给每个UI,都加上一个tag,以做区分,



然后在脚本中:

Ray ray = cameraEntity.camera.ScreenPointToRay(Input.mousePosition);
			RaycastHit hit;
			if(Physics.Raycast(ray, out hit) && hit.collider.gameObject.tag == "Ui")
			{
				Debug.DrawLine(ray.origin, hit.point);
				print("ray collider = " + hit.collider.gameObject.name); 
			}
这段代码首先创建了一个射线,从摄像机位置向触摸点,发射一条射线,然后判断射线碰撞的物体的tag 是不是“Ui”,通过hit可以得到物体

Debug.DrawLine() 在Scene窗口中绘制出射线,下面一句打印出了Ui的name


如果是Ui,响应Ui事件,相反则就是人物的移动了





转载请注明出处:











2013-04-19 17:10:45 iteye_20251 阅读数 211
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4645 人正在学习 去看看 张刚

一、创建Unity项目

       打开Unity游戏编辑器界面,在导航菜单栏中选择File --->  New Project菜单项,在弹出界面中选择Create new Project页面,将项目名命名为MobilityModel,然后再点击Create Project,完成项目的创建。

       然后点击保存(Ctrl+S)保存场景。

 

二、构建模型

       在Hierarchy视图中分别创建游戏对象Plane(面板)、Cube(立方体)、Sphere(球体)、Cylinder(圆柱体)、Capsule(胶囊体),然后鼠标拖动创建的游戏对象将他们摆放在合适的位置。

       接下来在游戏中添加一个光源,在Hierarchy视图中选择Create--->Directional light菜单项,光源是游戏中非常重要的一个属性,一定要在游戏场景中设置它,如果不设置光源对象,Game视图会非常暗,严重影响游戏的效果。

 

三、添加脚本

       在Project视图中点击Create--->JavaScript菜单项创建一个游戏脚本,将其命名为MobilityModelScript.js,在脚本上编写如下代码:

//模型移动速度
var TranslateSpeed = 10;
//模型旋转速度
var RotateSpeed = 1000;
//绘制UI界面
function OnGUI(){
	//设置GUI背景色
    GUI.backgroundColor = Color.red;
	if(GUI.Button(Rect(10,10,70,30),"向左旋转")){
		//向左旋转
		transform.Rotate(Vector3.up * Time.deltaTime * (-RotateSpeed));
	}
	if(GUI.Button(Rect(90,10,70,30),"向前移动")){
		//向前移动
		transform.Translate(Vector3.forward * Time.deltaTime * TranslateSpeed);
	}
	if(GUI.Button(Rect(170,10,70,30),"向右旋转")){
		//向右旋转
		transform.Rotate(Vector3.up * Time.deltaTime * RotateSpeed);
	}
	if(GUI.Button(Rect(90,50,70,30),"向后移动")){
		//向后移动
		transform.Translate(Vector3.forward * Time.deltaTime * (-TranslateSpeed));
	}
	if(GUI.Button(Rect(10,50,70,30),"向左移动")){
		//向左移动
		transform.Translate(Vector3.right * Time.deltaTime * (-TranslateSpeed));
	}
	if(GUI.Button(Rect(10,50,70,30),"向右移动")){
		//向右移动
		transform.Translate(Vector3.right * Time.deltaTime * TranslateSpeed);
	}
	
	//显示模型位置信息
	GUI.Label(Rect(250,10,200,30),"模型位置"+transform.position);
	//显示模型旋转信息
	GUI.Label(Rect(250,50,200,30),"模型旋转"+transform.rotation);
}

      上述代码中重要方法和属性如下:

      OnGUI()方法用来绘制GUI界面组件。

      GUI.Button():设置一个按钮,返回true时表示该按钮被按下。

      GUI.Label():设置一个文本框。

      transform:为当前绑定模型的变换对象。

      transform.Rotate():设置模型旋转。

      transform.Translate():设置模型平移。

      Time.deltaTime:该数值为一个只读属性,不可修改,表示完成最后一帧的事件,单位为秒。

      Vector3:标志一个模型移动或者旋转的方法。

      Rect:规定一个矩形区域,用于显示控件。

      将编写好的脚本对象,将其从Project视图拖拽到Hierarchy视图中的立方体(Cube)对象上,如果没有提示错误,表示脚本绑定成功,运行游戏后该游戏对象将执行该脚本中的内容。

 

       目前立方体对象与其他模型对象之间是不存在碰撞的,但是运行游戏后,可以控制立方体(Cube)直接穿越另一个模型对象。为了让模型对象之间具有物理的碰撞,需要给模型对象添加一个刚体(Rigidbody)属性,添加方式:首先在Hierarchy视图中选中立方体对象,在Uinty导航菜单栏中选择Component --> Physics 

-->Rigidbody菜单项即可。

 

四、测试运行

       点击运行按钮就能看到结果,可以点击显示的六个按钮对象,可以移动Cube(立方体)的位置和旋转。


 

2017-06-29 22:17:47 yzx5452830 阅读数 13992
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4645 人正在学习 去看看 张刚
 private Vector2 st = Vector2.zero; //手指开始按下的位置  
    private Vector2 end = Vector2.zero; //手指拖动的位置  
    enum slideVector { nullVector,up,down, left, right }; //上下左右四个方向
    private slideVector currentVector = slideVector.nullVector; //默认是null
    private float timer;//时间计数器  
    public float offsetTime = 0.01f;//判断的时间间隔  

    void OnGUI()
    {
        if (Event.current.type == EventType.MouseDown)//判断当前手指是按下事件  
        {
            st = Event.current.mousePosition;//记录开始按下的位置  
        }
        if (Event.current.type == EventType.MouseDrag)//判断当前手指是拖动事件  

        {
            timer += Time.deltaTime;  //计时器

            if (timer > offsetTime)
            {
                end = Event.current.mousePosition; //记录结束下的位置
                Vector2 slideDirection = st - end;
                float x = slideDirection.x;
                float y = slideDirection.y;

                if (y < x && y > -x)
                {
                    if (currentVector == slideVector.right) //判断当前方向
                    {
                        return;
                    }                  
                    Debug.Log("right");
                    currentVector = slideVector.right; //设置方向
                }
                else if (y > x && y < -x)
                {
                    if (currentVector == slideVector.left)
                    {
                        return;
                    }
                    Debug.Log("left");                  
                    currentVector = slideVector.right;
                }
                else if (y > x && y > -x)
                {
                    if (currentVector == slideVector.up)
                    {
                        return;
                    }
                    Debug.Log("up");               
                    currentVector = slideVector.up;
                }
                else if (y < x && y < -x)
                {
                    if (currentVector == slideVector.down)
                    {
                        return;
                    }
                    Debug.Log("down");                 
                    currentVector = slideVector.down;
                }
                timer = 0;
                st = end;//初始化位置
               
            }        
        }
        if (Event.current.type == EventType.MouseUp)
        {
            currentVector = slideVector.nullVector;       //初始化方向  
        }
    }


2017-07-05 更新   

添加了一个滑动距离 不然手指刚刚触碰上去就开始判断了滑动  

我个人默认距离是80  滑动距离超过80的时候才开始执行方法

    enum slideVector { nullVector, up, down, left, right };
    private Vector2 touchFirst = Vector2.zero; //手指开始按下的位置
    private Vector2 touchSecond = Vector2.zero; //手指拖动的位置
    private slideVector currentVector = slideVector.nullVector;//当前滑动方向
    private float timer;//时间计数器  
    public float offsetTime = 0.1f;//判断的时间间隔 
    public float SlidingDistance = 80f;

    void OnGUI()   // 滑动方法02
    {
        if (Event.current.type == EventType.MouseDown)
        //判断当前手指是按下事件 
        {
            touchFirst = Event.current.mousePosition;//记录开始按下的位置
        }
        if (Event.current.type == EventType.MouseDrag)
        //判断当前手指是拖动事件
        {
            touchSecond = Event.current.mousePosition;

            timer += Time.deltaTime;  //计时器

            if (timer > offsetTime)
            {
                touchSecond = Event.current.mousePosition; //记录结束下的位置
                Vector2 slideDirection = touchFirst - touchSecond;
                float x = slideDirection.x;
                float y = slideDirection.y;

                if (y + SlidingDistance < x && y > -x - SlidingDistance)
                {

                    if (currentVector == slideVector.left)
                    {
                        return;
                    }

                    Debug.Log("right");
                 
                    currentVector = slideVector.left;
                }
                else if (y > x + SlidingDistance && y < -x - SlidingDistance)
                {
                    if (currentVector == slideVector.right)
                    {
                        return;
                    }

                    Debug.Log("left");
       
                    currentVector = slideVector.right;
                }
                else if (y > x + SlidingDistance && y - SlidingDistance > -x)
                {
                    if (currentVector == slideVector.up)
                    {
                        return;
                    }

                    Debug.Log("up");
                  
                    currentVector = slideVector.up;
                }
                else if (y + SlidingDistance < x && y < -x - SlidingDistance)
                {
                    if (currentVector == slideVector.down)
                    {
                        return;
                    }

                    Debug.Log("Down");
                   
                    currentVector = slideVector.down;
                }

                timer = 0;
                touchFirst = touchSecond;
            }
            if (Event.current.type == EventType.MouseUp)
            {//滑动结束  
                currentVector = slideVector.nullVector;
            }
        }   // 滑动方法
    }  


2016-07-29 14:05:01 u014687749 阅读数 262
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4645 人正在学习 去看看 张刚

void MobileInput()
{
      if(Input.touchCount <= 0)
      return;
      //1个手指触摸屏幕
      if (Input.touchCount == 1)
      {
 
      if(Input.touches[0].phase == TouchPhase.Began)
      {
            //记录手指触屏的位置
            m_screenpos= Input.touches[0].position;
 
      }
      // 手指移动
      else if(Input.touches[0].phase == TouchPhase.Moved)
      {
          //移动摄像机
          Camera.main.transform.Translate(newVector3(Input.touches[0].deltaPosition.x * Time.deltaTime,Input.touches[0].deltaPosition.y * Time.deltaTime, 0));
       }
      //手指离开屏幕判断移动方向
      if(Input.touches[0].phase == TouchPhase.Ended &&
      Input.touches[0].phase!= TouchPhase.Canceled)
      {
          Vector2pos = Input.touches[0].position;
          //手指水平移动
          if(Mathf.Abs(m_screenpos.x - pos.x) > Mathf.Abs(m_screenpos.y - pos.y))
          {
              if(m_screenpos.x > pos.x){
              //手指向左划动
          }
          else{
              //手指向右划动
          }
    }
    else //手指垂直移动
    {
        if(m_screenpos.y > pos.y){
        //手指向下划动
    }
    else{
        //手指向上划动
    }
}
}
没有更多推荐了,返回首页