2013-02-24 19:28:38 jiuai455 阅读数 1924
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4649 人正在学习 去看看 张刚
Java代码 复制代码 收藏代码
  1. /*
  2. Touch Orbit
  3. Programmed by: Randal J. Phillips (Caliber Mengsk)
  4. Original Creation Date: 12/16/2011
  5. Last Updated: 12/16/2011
  6. Desctiption: Simple orbit by one touch and drag, as well as pinch to zoom with two fingers.
  7. */
  8. var x:float;
  9. var y:float;
  10. var xSpeed:float;
  11. var ySpeed:float;
  12. var pinchSpeed:float;
  13. var distance:float = 10;
  14. var minimumDistance:float = 5;
  15. var maximumDistance:float = 100;
  16. private var touch:Touch;
  17. private var lastDist:float = 0;
  18. private var curDist:float = 0;
  19. private var gameCamera:Camera;
  20. function Start ()
  21. {
  22. gameCamera = Camera.mainCamera;
  23. }
  24. function Update ()
  25. {
  26. if (Input.GetKeyDown(KeyCode.Escape))
  27. {
  28. Application.Quit();
  29. }
  30. if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
  31. {
  32. //One finger touch does orbit
  33. touch = Input.GetTouch(0);
  34. x += touch.deltaPosition.x * xSpeed * 0.02;
  35. y -= touch.deltaPosition.y * ySpeed * 0.02;
  36. }
  37. if (Input.touchCount > 1 && (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved))
  38. {
  39. //Two finger touch does pinch to zoom
  40. var touch1 = Input.GetTouch(0);
  41. var touch2 = Input.GetTouch(1);
  42. curDist = Vector2.Distance(touch1.position, touch2.position);
  43. if(curDist > lastDist)
  44. {
  45. distance += Vector2.Distance(touch1.deltaPosition, touch2.deltaPosition)*pinchSpeed/10;
  46. }else{
  47. distance -= Vector2.Distance(touch1.deltaPosition, touch2.deltaPosition)*pinchSpeed/10;
  48. }
  49. lastDist = curDist;
  50. }
  51. if(distance <= minimumDistance)
  52. {
  53. //minimum camera distance
  54. distance = minimumDistance;
  55. }
  56. if(distance >= maximumDistance)
  57. {
  58. //maximum camera distance
  59. distance = maximumDistance;
  60. }
  61. //Sets rotation
  62. var rotation = Quaternion.Euler(y, x, 0);
  63. //Sets zoom
  64. var position = rotation * Vector3(0.0, 0.0, -distance) + Vector3(0,0,0);
  65. //Applies rotation and position
  66. transform.rotation = rotation;
  67. transform.position = position;
  68. }
  69. function OnGUI()
  70. {
  71. //Simple output to display the distance from the center
  72. GUI.Label(Rect(0,0,Screen.width, Screen.height),distance.ToString());
  73. }  
2012-12-13 11:28:17 AnYuanLzh 阅读数 1469
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4649 人正在学习 去看看 张刚


来自:向日葵的博客
http://blog.sina.com.cn/xiangrikuiyoyo

最近在用Unity3D做一个2D的android手机休闲游戏,游戏中用两个GUItexture来控制角色左右行走和跳跃,第一次接触U3D觉得还是蛮很容易上手的。我整理了一下Manual里面关于Input的介绍,权当自己的学习小笔记吧。
    接下来进入正题,来讨论一下角色控制的一个细节问题——输入。在Unity3D中,游戏中常用的输入设备有键盘,鼠标,多点触摸屏……当然还有摇杆之类的。看了一下虚拟摇杆实现方法,相当简单方便,配合GetAxis()方法天衣无缝。但是我这次开发游戏没用到,就不赘述了。键盘,鼠标作为最传统的输入设备,可以用GetButton(),GetButtonDown(),GetButtonUp(),来获取键盘的输入.一般用GetKey()方法也可以。当然还有GetKeyDown(),GetKeyUP().有什么区别呢?我测试了一下,其实每个key是有自己的名字的.在unity提供的manual里面可以查到。我这里做个笔记,稍微写几个最常用的。
字母key:"a"'b'……
数字key:"1","2"……
方向键:"up","down","left","right"(是全小写的哟)
小键盘的数字:"[1]","[2]"...
控制键:"right shift","left ctrl"
特殊键:"backspace","tab","escape","delete"...
功能键:"F1","F2"...
鼠标:"mouse 0","mouse 1","mouse 2"(分别是左右中)
   
    这些key的名字,只能作为GetKey()方法的参数,GetButton()方法的参数是在Project Settings里面定义的Button的名字。
    重点来讨论一下多点触摸的输入。unity为我们提供了一个结构体 "Touch"来处理多点触摸输入。
    Input.touches,它是Touch类型的数组,最多5个元素吧,android设备的话性能差异比较2到5都有可能)
    这个变量结构体数组变量就是用户的输入拉~我们来分解一下这个Touch是个结构体变量。它有这些成员:
fingerld:touches的下标
position:(Vector2),记录手指的x,y屏幕坐标
deltaPosition:(Vector2)上次位置变化的差值
deltaTime:(这里也有deltaTime?)(float型),从上次变化开始,总计多少时间
tepCount:点击的数量。(IPhone、IPed是可以识别手指的快速按键的,用来记录用户在同一个位置连续点了多少下。android设备是不计数的,默认是1)
phase:阶段。
    到目前为止,我只用到position和phase两个参数。认识一下phase这个参数,类型是TouchPhase(一个枚举类型,有以下5种情况)
.Began :按了屏幕
.Moved :在屏幕上滑动了
.Stationary :正在按着屏幕
.Ended:手指离开了屏幕(这是触摸输入的最后动作)
.Canceled:系统停止对触摸进行追踪,比如弹出个键盘啊,有第六根手指在按之类的情况.
 
   那么,虚拟按键是怎么实现的呢?先定义一个GUITexture
button : GUITexture;
button.HitTest(Input.GetTouch(i).position);//如果按到了就返回true
    当然可以用phase当状态机。其实呢,向上面一句那么写是咋靠谱的,使用GetTouch()方法,必须要有Touch存在啊,要不然就下标越界了,得先判断。
    我用了一个很笨的办法,每个按键对应一个flag来判断是否down……
 
一点非常非常基础小知识。
貌似新浪博客不适合发code,我要另辟发技术博客的地方了。这里还是只作翻译整理和吐槽吧~~


2011-10-27 17:22:00 iteye_887 阅读数 51
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4649 人正在学习 去看看 张刚
Unity3D 游戏引擎之IOS触摸屏手势控制镜头旋转与缩放




雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6910267



前几篇文章介绍了很多Unity3D引擎自身的一些问题, 今天我们在回到IOS设备上讨论一些触摸屏幕手势,本章的目标是通过触摸iPhone屏幕手势 实现模型左右的旋转,与模型的缩放。


大家想一想模型的旋转,实际上是镜头的旋转。模型的缩放实际上是镜头Z轴方向的坐标。那么实现本章的内容只需要控制镜头的位置方可实现。


我们在游戏场景中创建一些简单的模型做为参照物,插一句 “大家有谁知道 . FBX 的模型那里可以免费找到,我想在博文中加点游戏模型让场景更好看一些,可是苦于找不到有点郁闷,用公司的模型来写博文有觉得有点不合适”哇咔咔 ,如果有知道的哥们 不妨告诉我喔。啦啦啦。



我们创建一个简单的游戏平面, 然后平面中放一个箱子做为旋转缩放的参照物。如下图所示,选中摄像机,给摄像机添加一个脚本名称为Move. 脚本中有一个参数Target,它的作用是设置摄像头旋转移动参照物,这里把一个箱子赋值给了 Target,那么左右滑动屏幕会发现箱子在旋转,两手缩放屏幕会发现箱子在放大与缩小。









我们看看Move这条脚本,说明一下几个重要的 :

这些方法都是系统自己调用的方法

function Start () : 游戏启动以后只调用一次,可用于脚本的初始化操作,

function Update ():Start()方法调用结束以后每一帧都会调用,可以在这里更新游戏逻辑。

function LateUpdate (): Start()方法调用结束以后每一帧都会调用,但是它是在 Update()调用完后调用。


Move.js完整代码


//用于绑定参照物对象 var target : Transform; //缩放系数 var distance = 10.0; //左右滑动移动速度 var xSpeed = 250.0; var ySpeed = 120.0; //缩放限制系数 var yMinLimit = -20; var yMaxLimit = 80; //摄像头的位置 var x = 0.0; var y = 0.0; //记录上一次手机触摸位置判断用户是在左放大还是缩小手势 private var oldPosition1 : Vector2; private var oldPosition2 : Vector2; //初始化游戏信息设置 function Start () { var angles = transform.eulerAngles; x = angles.y; y = angles.x; // Make the rigid body not change rotation if (rigidbody) rigidbody.freezeRotation = true; } function Update () { //判断触摸数量为单点触摸 if(Input.touchCount == 1) { //触摸类型为移动触摸 if(Input.GetTouch(0).phase==TouchPhase.Moved) { //根据触摸点计算X与Y位置 x += Input.GetAxis("Mouse X") * xSpeed * 0.02; y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02; } } //判断触摸数量为多点触摸 if(Input.touchCount >1 ) { //前两只手指触摸类型都为移动触摸 if(Input.GetTouch(0).phase==TouchPhase.Moved||Input.GetTouch(1).phase==TouchPhase.Moved) { //计算出当前两点触摸点的位置 var tempPosition1 = Input.GetTouch(0).position; var tempPosition2 = Input.GetTouch(1).position; //函数返回真为放大,返回假为缩小 if(isEnlarge(oldPosition1,oldPosition2,tempPosition1,tempPosition2)) { //放大系数超过3以后不允许继续放大 //这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改 if(distance > 3) { distance -= 0.5; } }else { //缩小洗漱返回18.5后不允许继续缩小 //这里的数据是根据我项目中的模型而调节的,大家可以自己任意修改 if(distance < 18.5) { distance += 0.5; } } //备份上一次触摸点的位置,用于对比 oldPosition1=tempPosition1; oldPosition2=tempPosition2; } } } //函数返回真为放大,返回假为缩小 function isEnlarge(oP1 : Vector2,oP2 : Vector2,nP1 : Vector2,nP2 : Vector2) : boolean { //函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势 var leng1 =Mathf.Sqrt((oP1.x-oP2.x)*(oP1.x-oP2.x)+(oP1.y-oP2.y)*(oP1.y-oP2.y)); var leng2 =Mathf.Sqrt((nP1.x-nP2.x)*(nP1.x-nP2.x)+(nP1.y-nP2.y)*(nP1.y-nP2.y)); if(leng1<leng2) { //放大手势 return true; }else { //缩小手势 return false; } } //Update方法一旦调用结束以后进入这里算出重置摄像机的位置 function LateUpdate () { //target为我们绑定的箱子变量,缩放旋转的参照物 if (target) { //重置摄像机的位置 y = ClampAngle(y, yMinLimit, yMaxLimit); var rotation = Quaternion.Euler(y, x, 0); var position = rotation * Vector3(0.0, 0.0, -distance) + target.position; transform.rotation = rotation; transform.position = position; } } static function ClampAngle (angle : float, min : float, max : float) { if (angle < -360) angle += 360; if (angle > 360) angle -= 360; return Mathf.Clamp (angle, min, max); }

在Untiy3D 中运行用鼠标手势点击上看不到任何效果的,必需在iPhone真机上才可以触摸感应到效果喔 . 嘻嘻~


OK 接下来将Unity3D 导出成Xcode项目,导出的方法有谁还不会??? 我的第一篇文章有说明噢。哇咔咔~~ 然后运行项目只能在真机上运行哦。。 看看我在iPhone 上的截图。







触摸iPhone屏幕镜头旋转与缩放以后的效果,这个图确实有点不太好截,我一会把项目的源代码工程下载地址贴上来,方便大家阅读与学习,哇咔咔~~








镜头任意的旋转与缩放,还不错噢,大家快点来学习Unity3D游戏开发吧,哇咔咔~~


最后欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,哇咔咔~~~ 附上工程的下载地址,文件名称是zoom.unitypackage,下载完毕的盆友们双击就可以自动在Unity3D 下打开它啦。然后导出成iPhone项目就可以运行了。
今天回家装个windows 7 最近对wp7的游戏开发有点兴趣哦~ 哦也~回家钻研一下~哇咔咔





2017-03-23 11:56:23 qq_26270779 阅读数 5347
  • Unity3D入门到精通-(3)Unity资源管理精讲

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

    4649 人正在学习 去看看 张刚

转载了别人写的一篇博客,写的很详细,感觉自己还跟别人差的好远昂~大哭

不过我把人家的精华搬过来了偷笑

原文链接:http://blog.csdn.net/u014550279/article/details/50537713


Unity 触屏操作

当将Unity游戏运行到iOSAndroid设备上时,桌面系统的鼠标左键可以自动变为手机屏幕上的触屏操作,但如多点触屏等操作却是无法利用鼠标操作进行的。Unity的Input类中不仅包含桌面系统的各种输入功能,也包含了针对移动设备触屏操作的各种功能,下面介绍一下Input类在触碰操作上的使用。

首先介绍一下Input.touches结构,这是一个触摸数组,每个记录代表着手指在屏幕上的触碰状态。每个手指触控都是通过Input.touches来描述的:

fingerId

触摸的唯一索引

position

触摸屏幕的位置

deltatime

从最后状态到目前状态所经过的时间

tapCount

点击数。Andorid设备不对点击计数,这个方法总是返回1

deltaPosition

自最后一帧所改变的屏幕位置

phase

相位,也即屏幕操作状态

其中phase(状态)有以下这几种:

Began

手指刚刚触摸屏幕

Moved

手指在屏幕上移动

Stationary

手指触摸屏幕,但自最后一阵没有移动

Ended

手指离开屏幕

Canceled

系统取消触控跟踪,原因如把设备放在脸上或同时超过5个触摸点

 

下面通过一段代码来进行移动设备触摸操作的实现:

using UnityEngine;
using System.Collections;

public class AndroidTouch : MonoBehaviour {

    private int isforward;//标记摄像机的移动方向
    //记录两个手指的旧位置
    private Vector2 oposition1=new Vector2();
    private Vector2 oposition2=new Vector2();

    Vector2 m_screenPos = new Vector2(); //记录手指触碰的位置

    //用于判断是否放大
    bool isEnlarge(Vector2 oP1, Vector2 oP2, Vector2 nP1, Vector2 nP2)
    {
        //函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势
        float leng1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));
        float leng2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));
        if (leng1 < leng2)
        {
            //放大手势
            return true;
        }
        else
        {
            //缩小手势
            return false;
        }
    }

    void Start()
    {
        Input.multiTouchEnabled = true;//开启多点触碰
    }

    void Update()
    {
        if (Input.touchCount <= 0)  
            return;
        if (Input.touchCount == 1) //单点触碰移动摄像机
        {
            if (Input.touches[0].phase == TouchPhase.Began)
                m_screenPos = Input.touches[0].position;   //记录手指刚触碰的位置
            if (Input.touches[0].phase == TouchPhase.Moved) //手指在屏幕上移动,移动摄像机
            {
                transform.Translate(new Vector3( Input.touches[0].deltaPosition.x * Time.deltaTime, Input.touches[0].deltaPosition.y * Time.deltaTime, 0));
            }
        }

        else if (Input.touchCount > 1)//多点触碰
        {
            //记录两个手指的位置
            Vector2 nposition1 = new Vector2();
            Vector2 nposition2 = new Vector2();

            //记录手指的每帧移动距离
            Vector2 deltaDis1 = new Vector2();
            Vector2 deltaDis2 = new Vector2();

            for (int i = 0; i < 2; i++)
            {
                Touch touch = Input.touches[i];
                if (touch.phase == TouchPhase.Ended)
                    break;
                if (touch.phase == TouchPhase.Moved) //手指在移动
                {

                    if (i == 0)
                    {
                        nposition1 = touch.position;
                        deltaDis1 = touch.deltaPosition;
                    }
                    else
                    {
                        nposition2 = touch.position;
                        deltaDis2 = touch.deltaPosition;

                        if (isEnlarge(oposition1, oposition2, nposition1, nposition2)) //判断手势伸缩从而进行摄像机前后移动参数缩放效果
                            isforward = 1;
                        else
                            isforward = -1;
                    }
                    //记录旧的触摸位置
                    oposition1 = nposition1;
                    oposition2 = nposition2;
                }
                //移动摄像机
                Camera.main.transform.Translate(isforward*Vector3.forward * Time.deltaTime*(Mathf.Abs(deltaDis2.x+deltaDis1.x)+Mathf.Abs(deltaDis1.y+deltaDis2.y)));
            }  
        }
    }
}

将这个脚本绑定在主摄像机上,发现单触摸操作可上下左右移动摄像机,双触摸操作可以缩放。

导出Android 在手机上运行,可以发现触摸起了效果。


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

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

    4649 人正在学习 去看看 张刚

一、创建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(立方体)的位置和旋转。


 

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