• 在前一段时间游戏开发中需要实现获取IOS设备所在的国家代码,方便服务端推送合适的语言的功能,在网上找了一些资料实现了上述功能,现在分享给大家。后面会给大家分享网络编程、数据库的应用、服务器的配置等的一些...

    原地址:http://dong2008hong.blog.163.com/blog/static/469688272014021025578/

    在前一段时间游戏开发中需要实现获取IOS设备所在的国家代码,方便服务端推送合适的语言的功能,在网上找了一些资料实现了上述功能,现在分享给大家。后面会给大家分享网络编程、数据库的应用、服务器的配置等的一些知识和注意事项。 
    首先,这个功能Unity是没有提供现成的API,所以必须先制作一个IOS插件,然后才再Unity里面来调用Object-c实现了的功能。 
    MyTool.h文件代码: 
    #import <Foundation/Foundation.h> 
    @interface MyTools : NSObject 
    @end 
    MyTool.m文件代码: 
    #import "MyTools.h" 
    @implementation MyTools 
    char *_getCountryCode(){ 
        NSLocale *locale = [NSLocalecurrentLocale]; 
        NSString *countrycode = [localelocaleIdentifier]; 
        NSLog(@"国家代码:%@",countrycode); 
         
        const char *country = [countrycodeUTF8String]; 
        char *back =malloc(countrycode.length + 1); 
        char *back2 = back; 
        for (int i = 0;i<countrycode.length; i++) { 
            *back2 = country; 
            back2++; 
        } 
        *back2 = '\0'; 
        return back; 
    } 
    @end 
    插件制作好以后,放到Plugins/IOS文件夹下,然后在Unity中创建MyTools.cs脚本 
    代码如下: 
    using UnityEngine; 
    using System.Collections; 
    using System.Runtime.InteropServices; 
    public class MyTools : MonoBehaviour { 
    [DllImport("__Internal")] 
    private static extern string _getCountryCode(); 
    public static string getCountryCode() 
    { 
    return _getCountryCode(); 
    } 
    } 
    在制作插件的时候一定要注意的问题就是,Object-c是不能直接传NSString数据类型给Unity的,你必须把NSString类型转化成char[]传给Unity。

     

    展开全文
  • 游戏发布,需要繁体中文和简体中文 iOS8以前OK,iOS9上通过Application.systemLanguage返回的简体...Unity 5.2.1、Unity 5.3都有这个问题 原因分析: 语言 iOS返回语言 Application.systemLanguage ios 7 简体

    游戏发布,语言本地化需要繁体中文和简体中文

    iOS8版本之前没问题,iOS9上无法正常识别这两种语言

    原因是在iOS9上,Unity通过Application.systemLanguage返回的简体中文和繁体中文都是SystemLanguage.Chinese,真尼玛坑爹啊,摔手机砸电脑~

    亲测Unity 5.2.1、Unity 5.3都有这个问题,Unity更新日志中都没有见这方面消息,不知是没人重视还是没人提~


    原因分析:

    语言			iOS返回语言			Application.systemLanguage
    
    ios 7
    简体中文			zh-Hans				ChineseSimplified
    繁体中文			zh-Hans				ChineseSimplified
    
    ios 8.1
    简体中文			zh-Hans				ChineseSimplified
    繁体中文(香港)		zh-HK				ChineseTraditional
    繁体中文(台湾)		zh-Hant				ChineseTraditional
    
    ios 9.1
    繁体中文			zh-Hant-CN			Chinese			
    简体中文			zh-Hans-CN			Chinese
    繁体中文(香港)		zh-HK				ChineseTraditional
    繁体中文(台湾)		zh-TW				Chinese


    可见苹果在iOS9上都做了什么鬼处理......


    解决方法:

    如果Application.systemLanguage返回的是chinese,直接通过C#调用ObjC函数获得当前iOS系统语言进行纠正

    using UnityEngine;
    using System.Collections;
    using System.Runtime.InteropServices;
    
    public class ComManager
    {
    	[DllImport("__Internal")]
    	// ios手机的当前语言 "en"、“zh"、“zh-Hans"、"zh-Hant"
    	private static extern string CurIOSLang();
    
    	/**
    		获得校正后的系统语言
    		因为ios9调整了系统语言,简体中文和繁体中文在ios9上Application.systemLanguage获取的值都是Chinese
    		无法区分简体中文和繁体中文
    
    		ios 7
    		简体				zh-Hans
    		繁体				zh-Hant
    
    		ios 8.1
    		简体中文			zh-Hans				ChineseSimplified
    		繁体中文(香港)		zh-HK				ChineseTraditional
    		繁体中文(台湾)		zh-Hant				ChineseTraditional
    
    		ios 9.1
    		简体中文			zh-Hans-CN			Chinese
    		繁体中文(香港)		zh-HK				ChineseTraditional
    		繁体中文(台湾)		zh-TW				Chinese
    	**/
    	public static SystemLanguage GetSystemLanguage()
    	{
    		SystemLanguage lang = Application.systemLanguage;
    		if (Application.platform == RuntimePlatform.IPhonePlayer)
    		{
    			if (lang == SystemLanguage.Chinese) {
    				string name = CurIOSLang();
    				if (name.StartsWith("zh-Hans")) {
    					return SystemLanguage.ChineseSimplified;
    				}
    
    				return SystemLanguage.ChineseTraditional;
    			}
    		}
    
    		return lang;
    	}
    }


    有朋友问上面生命的的CurIOSLang函数怎么来的,是在Objective-C中定义好的,C#中声明引用,具体可以看文章最后的Unity的C#和ObjC数据交互

    定义一个.mm文件,内容如下:

    extern char* cStringCopy(const char* string);
    
    extern "C"
    {
        // ios手机的当前语言 "en"、“zh"、“zh-Hans"、"zh-Hant"
       const char* CurIOSLang()
       {
       		NSArray *languages = [NSLocale preferredLanguages];  
        	NSString *currentLanguage = [languages objectAtIndex:0]; 
        	return cStringCopy([currentLanguage UTF8String]);
       }
    }


    相关资料:

    Unity的C#和ObjC数据交互  http://blog.csdn.net/teng_ontheway/article/details/50182217

    iOS获得当前系统语言 http://blog.csdn.net/teng_ontheway/article/details/50276987

    【Unity语言国际化】多语言缩写对应表 http://blog.csdn.net/teng_ontheway/article/details/48293617

    展开全文
  • 转自于 ... 刚体 Rigidbody Rigidbodies enable your GameObjects to act under the control of physics. The Rigidbody can receive forces and torque to make your...

    转自于 http://www.ceeger.com/Components/class-Rigidbody.html

    刚体 Rigidbody

    Rigidbodies enable your GameObjects to act under the control of physics. The Rigidbody can receive forces and torque to make your objects move in a realistic way. Any GameObject must contain a Rigidbody to be influenced by gravity, act under added forces via scripting, or interact with other objects through the NVIDIA PhysX physics engine.

    刚体使物体能在物理控制下运动。刚体可通过接受力与扭矩,使物体像现实方式一样运动。任何物体想要受重力影响,受脚本施加的力的作用,或通过NVIDIA PhysX物理引擎来与其他物体交互,都必须包含一个刚体组件。

    Properties 属性

    在这里插入图片描述
    在这里插入图片描述

    Details 细节

    Rigidbodies allow your GameObjects to act under control of the physics engine. This opens the gateway to realistic collisions, varied types of joints, and other very cool behaviors. Manipulating your GameObjects by adding forces to a Rigidbody creates a very different feel and look than adjusting the Transform Component directly. Generally, you shouldn’t manipulate the Rigidbody and the Transform of the same GameObject - only one or the other.

    刚体让物体在物理引擎控制下运动。它可以通过真实碰撞来开门,实现各种类型的关节及其他很酷的行为。通过力来操纵物体,与直接通过变换不同,有一种不同的感觉。通常情况下,对同一物体,要么通过刚体操纵,要么通过变换操纵。

    The biggest difference between manipulating the Transform versus the Rigidbody is the use of forces. Rigidbodies can receive forces and torque, but Transforms cannot. Transforms can be translated and rotated, but this is not the same as using physics. You’ll notice the distinct difference when you try it for yourself. Adding forces/torque to the Rigidbody will actually change the object’s position and rotation of the Transform component. This is why you should only be using one or the other. Changing the Transform while using physics could cause problems with collisions and other calculations.

    通过变换与通过刚体操纵最大的不同在于使用了力。刚体相比于变换,能够接受力与扭力。变换能够控制平移和旋转,但与物理方式的实现不同。你可以通过实践来明显地区分它们的不同。给刚体施加力和力矩实际也会改变物体变换组件的位置与旋转角度。这就是为什么在变换和刚体间,最好只选择一种操纵方式的原因。同时使用两种方式会导致旋转及其他计算出现问题。

    Rigidbodies must be explicitly added to your GameObject before they will be affected by the physics engine. You can add a Rigidbody to your selected object from Components->Physics->Rigidbody in the menubar. Now your object is physics-ready; it will fall under gravity and can receive forces via scripting, but you may need to add a Collider or a Joint to get it to behave exactly how you want.

    刚体在受物理引擎影响之前,必须明确添加给物体。你可以通过选中物体,然后在菜单Components->Physics->Rigidbody来增加一个刚体组件。现在,你的物体的物理属性就设置好了,但你也可以根据需要来为其增加碰撞器或关节。

    Parenting 父子级

    When an object is under physics control, it moves semi-independently of the way its transform parents move. If you move any parents, they will pull the Rigidbody child along with them. However, the Rigidbodies will still fall down due to gravity and react to collision events.

    当一个物体处于物理控制中,他会以半独立的方式随着变换的父亲的移动而移动。如果你移动父物体,那么它会将子刚体拖向它。但是,这个刚体仍然会根据重力下落或进行碰撞反应。

    Scripting 脚本

    To control your Rigidbodies, you will primarily use scripts to add forces or torque. You do this by calling AddForce() and AddTorque() on the object’s Rigidbody. Remember that you shouldn’t be directly altering the object’s Transform when you are using physics.

    可以通过脚本增加力或力矩来控制你的刚体。通过调用刚体中的AddForce()和AddTorque方法。 记住,不要同时使用物理与变换。

    Animation 动画

    For some situations, mainly creating ragdoll effects, it is neccessary to switch control of the object between animations and physics. For this purpose Rigidbodies can be marked isKinematic. While the Rigidbody is marked isKinematic, it will not be affected by collisions, forces, or any other part of physX. This means that you will have to control the object by manipulating the Transform component directly. Kinematic Rigidbodies will affect other objects, but they themselves will not be affected by physics. For example, Joints which are attached to Kinematic objects will constrain any other Rigidbodies attached to them and Kinematic Rigidbodies will affect other Rigidbodies through collisions.

    有些情况下,比如想实现布娃娃效果。需要刚体在动画与物理的操纵方式间切换。这种情况下,刚体可以标记为运动学模式。当刚体标记为运动学模式,他不会受到碰撞,力及任何物理影响,它表示你必须直接通过变换的方式来操纵该物体。运动学模式的刚体会与其他物体进行物理交互,但自身不受物理影响。例如,通过关节约束那些和运动学刚体连接起来的刚体,运动学刚体影响那些与之发生碰撞的刚体。

    Colliders 碰撞器

    Colliders are another kind of component that must be added alongside the Rigidbody in order to allow collisions to occur. If two Rigidbodies bump into each other, the physics engine will not calculate a collision unless both objects also have a Collider attached. Collider-less Rigidbodies will simply pass through each other during physics simulation.

    碰撞器是另一种组件,它和刚体一起,来使碰撞发生。如果两个刚体撞在一起,物理引擎将不会计算碰撞除非它们包含一个碰撞器组件。没有碰撞器的刚体,会在物理模拟中相互穿透。
    Add a Collider with the Component->Physics menu. View the Component Reference page of any individual Collider for more specific information:

    通过菜单Component->Physics menu来添加一个碰撞器。想知道更多信息,请看参考手册中碰撞器方面的介绍。

    Box Collider - primitive shape of a cube
    盒碰撞器——基本形状是个盒子。
    Sphere Collider - primitive shape of a sphere
    球碰撞器——基本形状是个球。
    Capsule Collider - primitive shape of a capsule
    胶囊碰撞器——基本形状是个胶囊。
    Mesh Collider - creates a collider from the object’s mesh, cannot collide with another Mesh Collider
    网格碰撞器——从物体的网格创建一个碰撞器。不能与其他网格碰撞器相碰撞。
    Wheel Collider - specifically for creating cars or other moving vehicles
    轮碰撞器——特殊的碰撞器,用于创建车或其他移动交通工具。

    Compound Colliders 复合碰撞器
    Compound Colliders are combinations of primitive Colliders, collectively acting as a single Collider. They come in handy when you have a complex mesh to use in collisions but cannot use a Mesh Collider. To create a Compound Collider, create child objects of your colliding object, then add a primitive Collider to each child object. This allows you to position, rotate, and scale each Collider easily and independently of one another.

    组合碰撞器是基本碰撞器的组合,共同扮演一个碰撞器的角色。当你有一个复杂网格却不适用网格碰撞器的情况下,使用组合碰撞器是个好的选择。要创建组合碰撞器,先为你的碰撞物体创建子对象,然后对每个子对象创建一个基本碰撞器。这样就允许你轻易的独立移动、旋转和放缩每个碰撞器。

    In the above picture, the environment has a Mesh Collider attached. Mesh Colliders work the best for terrain or environments made from irregular shapes. The gun_model GameObject has a Rigidbody attached, and multiple primitive Colliders as child GameObjects. When the Rigidbody parent is moved around by forces, the child Colliders move along with it. The primitive Colliders will collide with the environment’s Mesh Collider, and the parent Rigidbody will alter the way it moves based on forces being applied to it and how its child Colliders interact with other Colliders in the Scene.

    上图中,环境里包含一个网格碰撞器。网格碰撞器的最佳适用地方是不规则形状的地形或环境。如图,枪模型物体包含一个刚体组件,以及数个基本碰撞器的子物体。当刚体这个父对象受力移动时,它的子碰撞器也跟着移动。基本碰撞器与环境的网格碰撞器发生碰撞时,父对象的刚体也会因其子碰撞器与环境中其他碰撞器发生碰撞产生的力而改变运动轨迹 。

    Mesh Colliders can’t normally collide with each other. If a Mesh Collider is marked as Convex, then it can collide with another Mesh Collider. The typical solution is to use primitive Colliders for any objects that move, and Mesh Colliders for static background objects.

    网格碰撞器之间通常不相互碰撞,但如果一个网格碰撞器被标记为凸体,那么它就可以与其他网格碰撞器碰撞。典型的解决方案是,对移动的对象使用基本碰撞器,而对静态环境对象使用网格碰撞器。

    Continuous Collision Detection 连续碰撞检测
    Continuous collision detection is a feature to prevent fast-moving colliders from passing each other. This may happen when using normal (Discrete) collision detection, when an object is one side of a collider in one frame, and already passed the collider in the next frame. To solve this, you can enable continuous collision detection on the rigidbody of the fast-moving object. Set the collision detection mode to Continuous to prevent the rigidbody from passing through any static (ie, non-rigidbody) MeshColliders. Set it to Continuous Dynamic to also prevent the rigidbody from passing through any other supported rigidbodies with collision detection mode set to Continuous or Continuous Dynamic. Continuous collision detection is supported for Box-, Sphere- and CapsuleColliders. Note that continuous collision detection is intended as a safety net to catch collisions in cases where objects would otherwise pass through each other, but will not deliver physically accurate collision results, so you might still consider decreasing the fixed Time step value in the TimeManager inspector to make the simulation more precise, if you run into problems with fast moving objects.

    连续碰撞检测的主要作用是避免高速物体的穿透。在不连续碰撞检测模式下,一个高速物体的上一帧位置在一个碰撞器的一边,而下一帧位置就穿透该碰撞器时,就发生了穿透。为了解决这个问题,你要为高速物体设置连续碰撞检测模式。设置连续碰撞检测模式将避免刚体穿透静态网格碰撞器(该网格未必是刚体)。而设置为连续动态碰撞检测将避免刚体穿透设为连续动态碰撞检测与动态碰撞检测的刚体。盒碰撞器、球碰撞器技胶囊碰撞器支持动态碰撞检测。主要,连续碰撞检测只是提供了一种穿透的保护,它保证捕获碰撞事件,但并不保证碰撞反应的精确性。所以,当你发现高速物体有这方面问题时,得考虑降低TimeManager中的固定时间间隔来让模拟更加的精确。

    Use the right size 使用正确的大小

    The size of the your GameObject’s mesh is much more important than the mass of the Rigidbody. If you find that your Rigidbody is not behaving exactly how you expect - it moves slowly, floats, or doesn’t collide correctly - consider adjusting the scale of your mesh asset. Unity’s default unit scale is 1 unit = 1 meter, so the scale of your imported mesh is maintained, and applied to physics calculations. For example, a crumbling skyscraper is going to fall apart very differently than a tower made of toy blocks, so objects of different sizes should be modeled to accurate scale.

    你的物体网格的大小要比刚体的质量更加重要。如果你发现你的刚体不像你所期望的那样运动——慢、飘、碰撞不正确——那么请考虑调整你的网格资源的大小。Unity的默认长度单位是1单位=1米。你导入模型的大小会被保持,并参与物理运算中。例如,一个摩天大楼倒塌的表现肯定要异于一个玩具积木搭起来的塔,所以,对不同大小物体,要用精确的比例建模。

    If you are modeling a human make sure he is around 2 meters tall in Unity. To check if your object has the right size compare it to the default cube. You can create a cube using GameObject->Create Other->Cube. The cube’s height will be exactly 1 meter, so your human should be twice as tall.

    如果对一个人体建模,那么保证它大概在Unity中2米高。可以和一个默认的盒子对比来判断大小。使用 GameObject->Create Other->Cube来创建盒子。盒子的高为1米,所以你的人高度应该是它的两倍。

    If you aren’t able to adjust the mesh itself, you can change the uniform scale of a particular mesh asset by selecting it in Project View and choosing Assets->Import Settings… from the menubar. Here, you can change the scale and re-import your mesh.

    如果你不能自己调整网格,那你可以修改一个指定网格资源的比例,通过在项目视图中选中它,然后在目录里选择Assets->Import Settings,在这里,你可以选择比例,然后重新加载你的网格。

    If your game requires that your GameObject needs to be instantiated at different scales, it is okay to adjust the values of your Transform’s scale axes. The downside is that the physics simulation must do more work at the time the object is instantiated, and could cause a performance drop in your game. This isn’t a terrible loss, but it is not as efficient as finalizing your scale with the other two options. Also keep in mind that non-uniform scales can create undesirable behaviors when Parenting is used. For these reasons it is always optimal to create your object at the correct scale in your modeling application.

    如果物体在游戏中需要实例化成不同的比例,可以调整变换组件的比例轴。这种做法的缺点是在物体实例化时,物理模拟将执行更多操作,会导致游戏性能下降。 这不是很可怕的下降,但确实没有采用其他两种方法那样有效率。此外,父对象使用一个非标准比例的物体也会产生不好的行为。所以,建议是创建物体时尽量调整好标准比例。

    Hints 提示

    The relative Mass of two Rigidbodies determines how they react when they collide with each other.
    两个物体的相对质量定义它们之间的碰撞反应表现。
    Making one Rigidbody have greater Mass than another does not make it fall faster in free fall. Use Drag for that.
    一个质量大的物体并不会在自由落体中下落更快。想实现这种现象请使用阻力。
    A low Drag value makes an object seem heavy. A high one makes it seem light. Typical values for Drag are between .001 (solid block of metal) and 10 (feather).
    阻力越大,物体看起来越轻,阻力越小,物体看起来越重。阻力的典型值在0.001(砖头)到10(羽毛)之间。
    If you are directly manipulating the Transform component of your object but still want physics, attach a Rigidbody and make it Kinematic.
    如你直接操纵一个物体的变换同时又想拥有物理特性,那么 为其增加一个刚体组件,并将其设为运动学模式。
    If you are moving a GameObject through its Transform component but you want to receive Collision/Trigger messages, you must attach a Rigidbody to the object that is moving.
    若你通过变换来移动一个物体,并想接受碰撞或触发消息 ,你必须为其在移动时附加一个刚体组件。

    展开全文
  • Unity3D 脚本参考

    2012-01-19 14:55:54
    Unity3D 脚本中文参考 (1) 这是一个关于Unity内部脚本如何工作的简单概览。 Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成。在脚本对象内部不同的函数被特定的事件调用。最常用的列在下面: Update...

    Unity3D 脚本中文参考 (1)

    这是一个关于Unity内部脚本如何工作的简单概览。

    Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成。在脚本对象内部不同的函数被特定的事件调用。最常用的列在下面:

    Update:这个函数在渲染一帧之前被调用。这里是大部分游戏行为代码被执行的地方,除了物理代码。

    FixedUpdate

    这个函数在每个物理时间同步被调用一次。这是处理基于物理游戏行为的地方。

    在任何函数之外的代码:

    在任何函数之外的代码在物体被加载的时候运行。这个可以用来初始化脚本状态。

    注意:文档的这个部分假设你是用JS,参考用C#编写脚本获取如何使用C#和Boo编写脚本的信息。

    你也能定义事件句柄。它们的名称都以On开始,(例如 OnCollisionEnter)。为了查看完整的预定义事件的列表,参考MonoBehaviour文档。


    概览:常用操作

    大多数游戏物体的操作是通过游戏物体的Transform和/或Rigidbody来做的。在行为脚本内部它们可以分别通过transform和rigidbody访问。因此如果你想绕着Y轴每帧旋转5度,你可以如下写:

    functionUpdate(){

      transform.Rotate(0,5,0);

    }

    如果你想向前移动一个物体,你应该如下写:

    functionUpdate(){

     transform.Transtate(0,0,2);

    }


    概览:跟踪时间

    Time类包含一个非常重要的类变量,称为deltaTime。这个变量包含从上一次调用Update或FixedUpdate(根据你是在Update函数还是在FixedUpdate函数中)到现在的时间量。

    所以对于上面的例子,修改它使这个物体以一个恒定的速度旋转而不依赖于帧率:

     function Update(){

        transform.Rotate(0,5*Time.deltaTime,0)

    }

      移动物体:

     functionUpdate(){

       transform.Translate(0,0,2*Time.deltaTime);

    }

    如果你加或减一个每帧改变的值,你应该将它与Time.deltaTime相乘。当你乘以Time.deltaTime时,你实际表达:我想以10米/秒移动这个物体而不是10米/帧。这不仅仅是因为你的游戏将独立于帧率运行,同时也是因为运动的单位容易理解。(10米/秒)

    另一个例子,如果你想随着时间增加光照的范围。下面的表达式,以2单位/秒改变半径。

    functionUpdate(){

     light.range*=2.0*Time.delta.Time;

    }

      当通过力处理刚体的时候,你通常下不必用Time.deltaTime乘,因为引擎已经为你考虑到了这点。


    概览:访问其他组件

    组件被附加到游戏物体。附加Renderer到游戏物体使它在场景中渲染,附加一个Camera使它变为相机物体。所有的脚本都是组件,因为它们能被附加到游戏物体。

    最常用的组件可以作为简单成员变量访问:

     Component    可如下访问

    Transform      transform

    Rigidbody      rigidbody

    Renderer       renderer

    Camera        camera(only on camera objects)

    Animation      animation

    Collider        collider

    ……等等。

    对于完整的预定义成员变量的列表,查看Component,Behaviour和MonoBehaviour类文档。如果游戏物体没有你想去同类型的组件,上面的变量将被设置为null。

    任何附加到一个游戏物体的组件或脚本都可以通过GetComponent访问。

     transform.Translate(0,1,0);

    //等同于

    GetComponent(Transform).Translate(0,1,0);

    注意transform和Transform之间大小写的区别。前者是变量(小写),后者是类或者脚本名称(大写)。大小写不同使你能够从类和脚本名中区分变量。

    应用我们所学,你可以使用GetComponent找到任何附加在同一游戏物体上的脚本和组件。请注意要使下面的例子能够工作,你需要有一个名为OtherScript的脚本,其中包含一个DoSomething函数。OtherScript脚本必须与下面的脚本附加到相同的游戏物体上。

      //这个在同一个游戏物体上找到名为OtherScript的脚本

      //并调用它上面的DoSomething.

     function Updata(){

    otherScript= GetComponent(OtherScript);

    otherScript.DoSomething();

    }


    概览:访问其他游戏物体

    大多数高级的代码不仅需要操作一个物体。Unity脚本接口有各种方法来找到并访问其他游戏物体和组件。在下图,我们假定有一个名为 OtherScript.js的脚本附加到场景的游戏物体上。

    var foo =5;

    functionDoSomething(param:String){

     print(param + ”with foo:” + foo);

    }

    1.      通过检视面板赋值引用。

    你可以通过检视面板赋值变量到任何物体。

    //变量拖动到target槽的物体

    var target: Transform;

    functionUpdate()

    {

     target.Translate(0,1,0);

    }

    你也可以在检视面板中公开到其他物体的引用。下面你可以一个包含 OtherScript的游戏物体到检视面板中的target槽。

    //设置在检视面板中赋值的target变量上的foo,调用DoSomething.

    vartarget:OtherScript;

    functionUpdate()

    {

        //设置target物体的foo变量

        target.foo = 2;

        //调用target上的DoSomething

        target.DoSomething(“Hello”);

    }

    2.      通过物体层定位。

    对于一个已存在的物体,可以通过游戏物体的Transform组件来找到子和父物体:

    //找到脚本所附加的

    //游戏物体的子“Hand”

    transform.Find(“Hand”).Translate(0,1,0);

    一旦在层次视图中找到这个变换,你可以使用GetComponent来获取其他脚本,

    //找到名为“Hand”的子。

    //调用附加到它上面的OtherScript脚本的DoSomething.

    transform.Form(“Hand”).GetComponent(OtherScript)DoSomething(“Hello”);

     

    //找到名为”Hand”的子

    //然后应用一个力到附加在hand上的刚体

    transform.Find(“Hand”).rigidbody.AddForce(0,10,0);

    你可以循环所有的子。

    //变换的所有子向上移动10个单位

    for(var child: Transform in transform)

    {

     child.Transform(0,1,0);

    }

    参考Transform类文档获取更多的信息

    3.      根据名称或标签定位

    你可以使用GameObject.FindWithTag和GameObject.FindGameObjectWithTag搜索具有特定标签的游戏物体。使用GameObject.Find根据名称查找物体。

     functionStart()

     {

      //按照名称

      var go = GameObject.Find(“SomeGuy”);

      go.transform.Translate(0,1,0);

     

      //按照标签

      var player = GameObject.FindWithTag(“Player”);

      player.transform.Transform(0,1,0);

    }

      你可以在结果上使用GetComponent,在找到的游戏物体上得到任何脚本或组件。

        function Start()

    {

      //按名称

      vargo = GameObject.Find(“SomeGuy”);

     go.GetComponent(OtherScript).DoSomething();

     

      //按标签

      varplayer = GameObject.FindWithTag(“Player”);

     player.GetComponent(OtherScript).DoSomething();

    }

      一些特殊的物体有快捷方式,如主相机使用Camera.main。

    4.      作为参数传递

    一些事件消息在事件中包含详细信息。例如,触发事件传递碰撞物体的Collider组件到处理函数。

    OntriggerStay给我们一个碰撞器的引用。从这个碰撞器我们可以获取附加到其上的刚体。

    functionOnTriggerStay(other : Collider){

      //如果另一个碰撞器也有一个刚体

      //应用一个力到它上面

     if(other.rigidbody){

       other.rigidbody.AddForee(0,2,0);

      }

    }

      或者我们通过碰撞器获取附加在同一物体上的任何组件。

    functionOnTriggerStay(other:Collider){

      //如果另一个碰撞器附加了OtherScript

      //调用它上面的DoSomething

      //大多数时候碰撞器不会附加脚本

      //所以我们需要首先检查以避免null引用异常

     if(other.GerComponent(OtherScript)){

          other.GetComponent(OtherScript).DoSomething();

    }

    }

      注意通过上述例子中的other变量,你可以访问碰撞物体中的任何组件。

    5一种类型的所有脚本

      使用Object.FindObjectsOfType找到所有具有相同类或脚本名称的物体,或者使用Object.FindObjectOfType找到这个类型的第一个物体。

     function Start()

      {

    //找到场景中附加了OtherScript的任意一个游戏物体

    var other: OtherScipt = FindObjectOfType(OtherScript);

    other.DoSomething();

    }

     

    来源:http://oulehui.blog.163.com/blog/static/796146982010611112655758/

     

     

    概览:向量

      Unity使用Vector3类统一表示全体3D向量。3D向量的不同组件可以通过x,y和z成员变量访问。

    varaPosition:Vector3;

    aPosition.x= 1;

    aPosition.y= 1;

    aPosition.z= 1;

      你也可能够使用Vector3构造函数来同时初始化所有组件

    varaPosition = Vector3(1,1,1);

     Vector3也定义了一些常用的常量值。

    vardirection = Vector3.up;//与Vector3(0,1,0);相同

      单个向量上的操作可以使用下面方式访问:

    someVector.Normalize();

      使用多个向量的操作可以使用Vector3类函数:

    theDistance= Vector3.Distance(oneVector,otherVector);

      (注意你必须在函数名之前写Vector3.来告诉JS在哪里找到这个函数,这适用于所有类函数。)

      你也可以使用普通数学操作来操纵向量。

    combined =vector1 + vector2;

      查看Vector3类文档获取完整操作和可用属性的列表。


    概览:成员变量&全局变量

      定义在任何函数之外的变量是一个成员变量。在Unity中这个变量可以通过检视面板来访问。任何保存在成员变量中的值也可以自动随工程保存。

      varmemberVariable = 0.0;

    上面的变量将在检视面板中显示名为”Member Variable”的数值属性。

    如果你设置变量的类型为一个组件类型(例如Transform,Rigidbody,Collider,任何脚本名称,等等)。然后你可以在检视面板中通过拖动一个游戏物体来设置它们。

      varenemy : Transform;

     function Update()

      {

       if(Vector3.Distance(enemy.position,transform.position)<10){

          print(“I sense the enemy is near”);

    }

    }

      你也可以创建私有成员变量。私有成员变量可以用来储存那些在该脚本之外不可见的状态。私有成员变量不会被保存到磁盘并且在检视面板中不能编辑。当它被设置为调试模式时,它们在检视面板中可见。这允许你像一个实时更新的调试器一样使用私有变量。

    privatevar lastCollider : Collider;

     

    functionOnColliderEnter(collisionInfo : Collision){

      lastCollider = collisionInfo.other;

    }

    全局变量

    你也可以使用static关键字创建全局变量。

    着创造了一个全局变量,名为someGlobal。

     //TheScriptName.js中的一个静态变量

     static var someGlobal = 5;

     

      //你也可以在脚本内部像普通变量一样访问它

     print(someGlobal);

     someGlobal = 1;

    为了从另一个脚本访问它,你需要使用这个脚本的名称上加上一个点和全局变量名。

     print(TheScriptName.someGlobal);

     TheScriptName.someGlobal = 10;

     

     

    来源:http://oulehui.blog.163.com/blog/static/7961469820107934114974/

     

     

    Unity 3d 引用 GUI QQ似展开

    像QQ一样,你放上面 你鼠标放上去它会向下展开 .

     

    var show = false;
    var grow = false;
    var min = 0.0;
    var max = 50.0;
    var height = 0.0;
    var speed = 0.0;
    //var skin:GUISkin;
    function OnGUI ()
    {
    //GUI.skin = skin;
    if(GUI.Button(Rect(5,5,104,25),"List"))
    {
    grow = true;
    if(!show)
    show = true;
    }
    if(show)
    {
    GUILayout.BeginArea(Rect(7,30,100,height),"","Box");
    GUILayout.BeginVertical();
    for(i = 0;i<8;i++)
    GUILayout.Button(i+".Title");
    GUILayout.EndVertical();
    GUILayout.EndArea();
    }
    if(grow)
    {
    speed += Time.deltaTime*5.0;
    height = Mathf.Lerp(min,max,speed);
    if(Mathf.Approximately(height,max))
    {
    grow = false;
    max = min;
    min = height;
    speed = 0.0;
    if(min == 0)
    show = false;
    }
    }
    }

     

     

    Unity 3d 给物体添加力

    Unity 3D 2010-08-26 17:08:43 阅读62 评论0  字号: 订阅

          第一种:
    this.gameObject.rigidbody.AddForce(0,0,5);
    加力的方向和力度
          第二种:
    this.gameObject.rigidbody.AddForceAtPosition(ts.position -this.transform.position, transform.position,ForceMode.Impulse);
    (力的目标,本身,力的类型)

     

     

     

    引用 U3D屏幕截图

    Unity 3D 2010-08-23 17:06:12 阅读58 评论0  字号: 订阅

    本文引用自博者《U3D屏幕截图》

     

    引用

    博者 的 U3D屏幕截图
    function ScreenshotEncode()
    {
        // wait for graphics to render
        yield WaitForEndOfFrame();
        
        // create a texture to pass to encoding
        var texture:Texture2D = new Texture2D (Screen.width,Screen.height, TextureFormat.RGB24, false);
        
        // put buffer into texture
        texture.ReadPixels(Rect(0.0, 0.0, Screen.width,Screen.height), 0.0, 0.0);
        texture.Apply();

        // split the process up--ReadPixels() and the GetPixels()call inside of the encoder are both pretty heavy
        yield;
        
        // create our encoder for this texture
        var encoder:JPGEncoder = new JPGEncoder(texture, 75.0);
        
        // encoder is threaded; wait for it to finish
        while(!encoder.isDone)
            yield;
        
        // save our test image (could also upload to WWW)
        File.WriteAllBytes(Application.dataPath +"/../testscreen-" + count + ".jpg", encoder.GetBytes());
        count++;
    }


    //简便方法看下面:

    function OnMouseDown() {
    Application.CaptureScreenshot("Screenshot.png");
    }

     

     

    Unity 3d 射线(获得鼠标点击的坐标[x,y,z])

    Unity 3D 2010-08-19 11:49:40 阅读134 评论0  字号: 订阅

    using UnityEngine;
    using System.Collections;

    public class Lu : MonoBehaviour
    {
        public Camera cam;
        // We need to actually hit an object
        RaycastHit hitt = new RaycastHit();

        // Use this for initialization
        void Start()
        {

        }

        // Update is called once per frame
        void Update()
        {
            Ray ray =cam.ScreenPointToRay(Input.mousePosition);
            Physics.Raycast(ray, out hitt, 100);
            //   Debug.DrawLine(cam.transform.position, ray.direction,Color.red);
            if (null != hitt.transform)
            {
                print(hitt.point);//鼠标点击的坐标
            }
        }
    }

     

     

    Unity 3d 用代码脚本建造一堵Cube墙

    Unity 3D 2010-08-17 10:26:59 阅读142 评论0  字号: 订阅

    C#版:
    // Use this for initialization
        void Start()
        {
            for (int y = 0; y < 5; y++)
            {
                for (int x =0; x < 5; x++)
                {
                   GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
                   cube.AddComponent<Rigidbody>();
                   cube.transform.position = new Vector3(x, y, 0);
                }
            }
        }
    JS版:
    function Start () {
            for (var y = 0; y < 5; y++) {
                 for (var x = 0; x < 5; x++) {
                         var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
                         cube.AddComponent(Rigidbody);
                         cube.transform.position = Vector3 (x, y, 0);
                 }
           }
    }

     

     

    Unity 3d 里 Render Texture在屏幕中做小屏幕用

    Unity 3D 2010-08-16 13:39:06 阅读181 评论2  字号: 订阅

    先做准备工作,我们要用到Render Texture.先创建一张rendertexture图片。
     

      

    这时候这张照片是空的,因为我们没指定摄像机。在顶视图创建一个相机,调整好位置。在target texture 选项里,选择刚才创建的render texture。

    这时候render texture 里面就有画面了。如图
     


    接下来我们就要让它显示出来。代码如下:
    var pic:RenderTexture;
    function OnGUI () {
    GUI.Box(Rect(0,Screen.height-100,100,100),pic);
    }

     

      

     

    Unity 3d 里有关时间延迟

    Unity 3D 2010-08-11 16:11:42 阅读65 评论0  字号: 订阅

    IEnumerator WaitAndPrint(float waitTime)
        {
            // pause execution for waitTimeseconds
            yield return newWaitForSeconds(waitTime);
            print("----------------")
        }

    在其它方法里调用:
    StartCoroutine(WaitAndPrint(3.0F));
    好像在Update里不好用。没试。



    暂停Time.timeScale = 0;
    FixedUpdate功能将不会被调用时, 时间刻度设置为零。

     

     

     

    untiy3d(运行性能)的美工方面需要知道的知识(二)

    Unity 3D 2010-08-11 14:48:39 阅读90 评论0  字号: 订阅

    总体来说:合并,合并,合并!

    如果你比较关心游戏的速度,请合并模型。最好能够把合并的模型使用同样的材质贴图(材质也要合)RenderingStatistics窗口时很有用的!

    现在的图形显卡可以很好的支持很多的多边形,但是他们他们还是有一些瓶颈的。所以如果你有一个有100个三角形的MESH,它渲染起来所需要花费的运算跟1500个面数的物体是没有多大差别的。因此最佳的渲染设置时每个模型大约1500-4000个三角面。

    只有在游戏组件中的属性栏中勾选MeshRenderer选项显卡才会渲染相应的模型,并且在场景中的空的GameObject组件是不会被渲染的。

          所以再次重复,最好的导入渲染设置时合并Objects直到他们每个模型在1500个三角面面甚至更高一些,并且为整个模型使用一个材质。

    如果只是把两个模型合并在一起但是不共同使用同一个材质并不会给你的图形带来一点优化。如果你想有效的合并物体,你需要保证你合并后的模型使用一个材质。(其实就是尽量减少材质球的数量)

    在你合并物体的时候需要知道一件事:如果你在你的场景中用到了很多小的灯光,你可以把场景中离得很近的物体合并为一个Object。

    按照上面的思路,如果一个MESH具有多个材质球,那就说明在计算机渲染的时候是要进行多重运算的。最普遍的你之所以一个MESH用多个材质的原因是因为两个材质不能使用相同的贴图。所以如果你想要优化渲染设置,你最好确定你合并的那些MESH的材质是相同的。

          Unity对于向显卡导出各种多边形是很擅长的,它可以很详尽的把所有的图形导入到显卡,并且优化数据。你需要做的只是确定你的图形显示卡正常工作。而不是要调整很多手动调节的设置。

          Thenumber of Pixel Lights affecting an object heavily affectsperformance. 相当数量的实时灯光对于游戏速度也是有限制的。

    如果你想要有一个不错的展示,并且不关心凹凸贴图和实施灯光(Bumpmappingor Pixel Lighting),可以去Edit->RenderSettings...然后设置PixelLight Coun为0.这将会给所有的Object使用顶点灯光。这将会让所有的物件在每一帧都会被渲染一次。这是一个比较极端的LOD设置,所以你的游戏就可以再比较老的图形显卡下运行了。

    Pixellights 像素灯光

    如果你使用的是像素灯光,那么每个被这个灯光照射到的GameObject都会在每一帧被渲染一次。如果你合并了两个距离很远的物体,他就会增加物件的大小,然后你就会需要一些灯光来照亮这些物体。如果你的物件是分开的,灯光将不会渲染远处的物体,这将会导致模型得到多次渲染,相比较没有被合并的模型,我们并没有得到多少实惠。因此,如果你的GameObject中有很多独立物件的时候,你可以让他们离得比较远。

    当渲染一个模型的时候,UNTIY如果发现很多灯光在MESH的周围,它将会找出那个是主要影响这个MSEH的灯光,在Edit->RenderSettings中的设置就是用来调整有多少个灯光最终作为像素灯光有多少作为顶点灯光。

    每一个灯光通过计算离MESH得距离和自己灯光强度来决定自己的重要程度。

    在游戏中的某些灯光是很重要的,所以,每一个灯光都会有一个RenderMode设置,这个用来设置哪一个可以被用来设置为ForcePixel 或者 ForceVertex.

    想象一下假如我们是一个驾车的游戏,你的角色在夜晚打开车灯,前面的车灯就是游戏中最重要的灯光。因此,前大灯的渲染模式将会被设置为ForcePixel

    当然如果你有一个不是很重要的灯光,也是选择使用"ForceVertex"的渲染模式,这个方式也不会对游戏的速度有很大的影响的。

    影子

    阴影普遍运算量比较大。如果运用得当,可以让游戏画面出色,你也可以乐队相关文档。

    角色建模优化

    你的角色应该只被用于一个蒙皮模型渲染器。当然有时候可能需要多个蒙皮的模型,但是如果你同时用两个蒙皮来作为一个角色,它就相当于你进行了两个角色的运算量。


    你同样需要保持MESH的材质数量尽可能低。一般建议身体的材质数量为2-3个,当然如果你有武器的材质,也是需要单独一个的,因为你需要换武器。


    减少骨骼的数量,一般来说游戏中的骨骼数量为15-60个。骨骼越少运行速度越快,一般来说30块骨骼就可以让角色动的很舒服了。如果你不是有特殊的设置,我们强烈建议每个角色30个骨骼。


    多边形的数量主要是看你对游戏的质量要求,500-6000个三角面是比较推荐的。如果你的游戏场景中将会出现多个角色,那么就要适当的降低一下多边形数 量了。如果你想要在比较老的机器上运行,你需要更少的多边形数量。比如,半条命2游戏的角色通常是2500-5000个三角面。达到AAA标准的次时代游 戏比如像是PS3或者XBOX360上的游戏角色通常有5000-7000个三角面。


    把IK控制器和FK控制器分离,当动画导入以后,IK的节点将会烘焙到FK上,其实UNITY并不需要IK节点,你可以删除它们。


    创建一个公共的骨架,这样就可以让你让不同的角色之间共享动作了。


    给每一个骨骼正确的命名,方便团队工作,也方便类似于Motionbuilder的动作软件,不然你得每次指定骨骼。

    优化综合的图形卡


    优化模型参数


    使用尽量少的面


       UV接缝的数量尽可能少


    烘焙灯光

    烘焙灯光到光照贴图或者到顶点颜色。

    MAYA具有不错的制作光照贴图的工具,UNITY可以从MAYA中导入第二个UV贴图或者顶点颜色。

    制作环境的光照贴图的流程要比直接在场景中打灯光要繁琐的多,但是


    运行速度明显增快。


    如果你使用全局光并且平滑光照贴图,可以让画面效果明显增强。


    甚至次时代游戏比如战争机器始终在很多方面使用光照贴图。通常他们在场景中使用光照贴图,然后在上面放置一个动态灯光。在UNITY中也可以制作相应的光照贴图Shader.

     

     

    来源于:http://hi.baidu.com/jdk900/blog/item/381acffea3e7993b5d6008df.html

     

     

     

    untiy3d(性能)的美工方面需要知道的知识(一)

    Unity 3D 2010-08-11 14:43:15 阅读131 评论0  字号: 订阅

    首先,向伟大的SAKARI团队致敬,他们的游戏真不错,我也想模仿一下。截图如下:

    我其实在我桌子上的废纸上记录了很多相关的类似于上面的总结,结果因为是废纸,丢了很多,不过还好,很多脑袋里面还有点印象,趁着没忘干净,赶紧记录下来。

    (下面是正文)

    总结着来,不怎么有条理,凑活着看吧。

    1.引擎没有说具体的面数限制,也许是跟VIRTOOLS一样的标准,按机器性能而定。

    2.导入图形或者MESH的方法无非两种,一种是直接拷贝到文件目录下的Assets文件夹下面,Unity3d引擎会自动找到添加的文件,并且能在PROJECT面板中找到它。另一种是我们在PROJECT面板中用右键菜单,导入素材。

    当然,我是用MAYA导入的,U3D引擎对于MAYA的支持还是不错的,但是也需要注意,不要用中文的目录结构,最好直接从MAYA的工程文件夹中导入,最好在导入MESH前先吧贴图文件放到相应的文件夹,或者相关文件夹的子文件夹。

    在我们导入场景文件的时候,需要在导入设置中勾选创建碰撞,这样导入的场景我们就可以踩在上面了。(这跟我们添加碰撞组件是有些不同德)

    3.Unity3d引擎支持大多数常用的贴图,比如漫反射贴图,高光贴图,法线贴图。如此一来,它就成了一个名副其实的次时代引擎了。当然与UNREAL引擎 的强大材质编辑器不同,U3D引擎主要是编辑材质的方式是使用一种专门的语言,类似于CgFX和Direct3D的语法。当然如果不是专门的图形程序员, 我们只要掌握相关的SHADER的使用方法就可以了。在我们安装完U3D引擎后,系统自带的SHADER足够我们日常大多数情况下使用了。如果我们还有特 殊的要求,可以去官网上下载相关的程序,然后把代码保存为.shader 的文件,放到相应的目录底下,然后我们就有了这种SHADER。

    ------------------------------------------------------------------

    掌握并且理解了上面我说的乱七八糟的三点,你就可以作为一个U3D引擎的美工开始工作了。其中有几个需要我们进行深入探讨的几个方面:一是导入的MESH的要求,如何减面,UV的情况怎样,是否可以重叠UV。 二是导入的贴图规范,我们的各种贴图要达到怎样的程度才能导入,并不是直接拍了照片贴上就很有效果的,我们需要在三维软件中烘焙,之后才能导入。还有光照 贴图怎么制作。 三是各种材质的应用,比如说我们最常用在皮肤上的3S材质效果,如何在U3D引擎中实现这种效果?

    至此,你可以轻松的驾驭U3D引擎的Assets部分了。(松了一口气,其实很简单)

    然后我们要用引擎构建关卡。好吧现在你要成为一个U3D引擎的关卡设计师,当然这里面也有很多美工要做的事情。我们不用每天对着素材模型,贴图骂娘了。

    作为关卡设计师,特别是U3D的,一定要有一个GAMEOBJECT的概念,在这个可爱引擎中,我们可以看到各种的元素都是由GAMEOBJECT组成的,在GAMEOBJECT上我们又可以添加组件在实现特定的功能,比如最简单的位移。我在第一次使用这个引擎的时候,突然兴致大发想要在场景中创建一盏灯,弄了半天都 没成,后来才明白,灯光是要附着在GAMEOBJECT上的。同理,声音也是要附着在这上面的。

    还要有一个PREFABS得概念,就在层级菜单中的蓝色文字所代表的属性,其实就是在游戏中可以无限复制的意思,比如子弹,比如无数的需要出现的小物件儿。

    类似于三维软件以及其他引擎,U3D的灯光分为那么普通的几类,电光源、方向光、自然光。了解灯光的属性和使用方法。

    还有U3D引擎的物理系统。当我看到这个系统的时候我的心都开花了,一想到各种独立游戏中无敌的物理效果心里就暗爽。比如我们可以用最简单的方法做一个足球游戏。

    ********************

    还是做游戏好,这个引擎能做网页游戏,也可以做PC单机游戏,网络游戏,也可以做IPHONE平台的手机游戏。真是万能了!

    当然,上面很多都是初学时候的经验,下面是我后来加上的一些内容,是经过学习总结和辛苦翻译的。

    让你的游戏能够顺畅的运行是成功的第一个要求。感谢UNTIY,他们通过大量的优化和调整可以让这个引擎发布的游戏运行于各种不同性能的硬件系统。下面是一个通用的优化游戏性能的方法。

     

     

    来源于:http://hi.baidu.com/jdk900/blog/item/ed33fe00ce1fdb1b738b65d3.html

     

    Unity 3d 拖拽物体的脚本

    Unity 3D 2010-07-30 16:31:52 阅读83 评论0  字号: 订阅

    function OnMouseDown () {
    var screenSpace = Camera.main.WorldToScreenPoint(transform.position);
    var offset = transform.position -Camera.main.ScreenToWorldPoint(Vector3(Input.mousePosition.x,Input.mousePosition.y, screenSpace.z));
    while (Input.GetMouseButton(0))
    {
    var curScreenSpace = Vector3(Input.mousePosition.x, Input.mousePosition.y,screenSpace.z);
    var curPosition = Camera.main.ScreenToWorldPoint(curScreenSpace) + offset;
    transform.position = curPosition;
    yield;
    }
    }

     

     

    Unity 3d <=实时阴影减少锯齿

    Unity 3D 2010-07-28 17:16:38 阅读175 评论0  字号: 订阅

    这是我看《叫你自由》的视频后写的。多谢
    =====================================================================

    实时阴影的资源优化

    如何减少锯齿感?

    1.       合理设置斜面常量的数值

    在灯光里调

    Shadows->Constant Bias

                  ->ObjectSize Bias

    这两个是斜面常量数值,主要是调解自身的锯齿

    2.       尽量减小被投射阴影物体的面积(光投射的面积,越小越好)

    3.       不考虑资源的情况下,尽量使用大阴影贴图

    贴图尺寸:Edit->project settings->Quality

    这就是运行exe文件时的选择质量

    就以Good为例:

            Shadows

            ShadowResolution

                   这个就是贴图的分辨率

                          LowResolution

                          MediumResolution 默认

                          HighResolution 设置这个效果会好些

            ShadowCascades

                   这个就是第四点要说的级别

                          NoCascades

                          TwoCascades默认 (把细节与宏观分开)

                          Four Cascades  设置成4级

            ShadowDistance

                   (第5点)这个就是显示阴影的距离,镜头远处的阴影不会显示

            AntiAliasing 默认为Disabled(无)第7点

                   Disabled

                   2x MultiSampling

                   4x MultiSampling

                   8x MultiSampling

                   16x MultiSampling

                   根据机器配置选择。

    4.       使用4级阴影贴图

    5.       尽量减小阴影对摄影机的可见距离

    6.       软阴影可达到抗阴影锯齿效果

    软阴影在灯光里调

    Shadows->Type  阴影的类型

           No Shadows 默认无

           HardShadows

           SoftShadows 选择这个软阴影

    7.       系统抗锯齿打开后,也会有少许效果

    Unity 3d 物体运动到指定位置(X,Y,Z)

    Unity 3D 2010-07-28 17:11:11 阅读70 评论0  字号: 订阅

    int smooth = 2; 
    Quaternion target = Quaternion.Euler(0, 0, 0);//目标
                // Dampentowards the target rotation
               transform.rotation = Quaternion.Slerp(transform.rotation, target,Time.deltaTime * smooth);

    控制GUI Texture的位置,置顶、置底、靠左、靠右、全屏的JS

    Unity 3D 2010-07-21 14:03:09 阅读115 评论0  字号: 订阅


    var Relative : boolean ;
    var Top : boolean ;
    var Right : boolean ;
    function OnGUI() {
        otherScript = GetComponent(GUITexture);//将GUITexture传递过来
        thetexture = otherScript.texture;//获取GUITexture的纹理
        if (Relative == true ){
            if (thetexture.width >thetexture.height) {
                W = Screen.width;
                H =(Screen.width*thetexture.height)/thetexture.width;
            } else {
                W =(Screen.height*thetexture.width)/thetexture.height;
                H = Screen.height;
            } 
        } else {
            W = thetexture.width ;
            H = thetexture.height ;
        }
        if (Top == true ){
            Y = Screen.height - H;
        } else Y = 0 ;
        if (Right == true ){
            X = Screen.width -W;
        } else X = 0;
        otherScript.pixelInset = Rect (X,Y,W,H);
        //print (otherScript.pixelInset );
    }
    没使用前:


    全屏按比例缩放:

    置顶:

     置顶、靠右:

     

    来源于:http://www.anyfar.com/article/Unity3D/30.htm

    Unity 3d 拖动GUI(拖动图片)

    Unity 3D 2010-07-14 14:20:00 阅读67 评论0  字号: 订阅

    var windowRect = Rect (20, 20, 120, 50);

    function OnGUI () {
    // Register the window.
    windowRect = GUI.Window (0, windowRect, DoMyWindow, "My Window");
    }

    // Make the contents of the window
    function DoMyWindow (windowID : int) {
    // Make a very long rect that is 20 pixels tall.
    // This will make the window be resizable by the top
    // title bar - no matter how wide it gets.
    GUI.DragWindow (Rect (0,0, 10000, 20));
    }

     

     

    根据这个内容可以想到鼠标点击拖动图片::

    varimage:Texture;
    var guiTexture:Rect;

    functionAwake()
    {

           guiTexture.width=image.width;
            guiTexture.height=image.height;
    }
    function OnGUI()
    {

           guiTexture=GUI.Window(0,guiTexture,popWin,"");
    }
    function popWin(winId:int)
    {

          GUI.DrawTexture(Rect(0,0,guiTexture.width,guiTexture.height),image);
           GUI.DragWindow();
    }

    让js编辑器SciTEG永久支持中文

    Unity 3D 2010-07-13 15:00:15 阅读51 评论0  字号: 订阅

    今天收获真不小实在忍受不了 每次打开都要设置uncode==utf-8 尝试修改了些属性果然实现了
    假如你的代码中有中文这个设置是很爽的。以后注释也可以中文了。
    说方法:
    1.用记事本打开D:\ProgramFiles\Unity\Editor\Data\Tools\UniSciTE\SciTEGlobal.properties
              //你装的路径
    2.找到# Internationalisation这一行下面的都是设置编码的(鄙视一下居然是Japanese )
    3.可以把下面这段的都删除掉 到#output.code.page=65001这里
    然后把下面粘贴到这个位置(改把chinese 作为注释 )
    4.大功告成 。试一下打些中文然后选择中文 如果不乱码(不改这个选择中文会乱码) 恭喜你成功!
    ===========================================================================
    #Internationalisation
    # Chinese input code page 936 and Chinese character set 136
    code.page=936
    character.set=136
    # Unicode
    code.page=65001
    character.set=136
    # Required for Unicode to work on GTK+:
    LC_CTYPE=en_US.UTF-8
    output.code.page=65001
    ======================================================================================

    来源于:http://www.iu3d.com/viewtopic.php?f=22&t=67

    让Unity的脚本编辑器默认显示行号

    Unity 3D 2010-07-13 14:22:05 阅读61 评论0  字号: 订阅

    U的脚本编辑器默认是不显示行号的,每次打开都要勾选,很麻烦,刚刚发现一个办法可以修改编辑器的设置,首先找到编辑器的配置文件,比如:我的配置文件路径
    D:\Unity\Editor\Data\Tools\UniSciTE\SciTEGlobal.properties
    找到之后用文本编辑器打开它,让后在里面随便哪一行加上这句
    line.margin.visible=1
    保存一下再重新打开编辑器看看.

     

     

    U3d唤醒的数学知识

    Unity 3D 2010-07-13 13:54:38 阅读49 评论0  字号: 订阅

    太久没运用几何知识了,u3d也确实封装掉了太多的知识,搞得就只会用函数而不懂原理了,很多公式一时还真记不起来,这几天居然拿出了纸在推导一些公式,以怀念我从小学到大学值得骄傲的数学知识。

    1.角度与弧度互转(别告诉我连弧度是什么你都不知道了)
      弧度=角度*3.14159f/180.0f 
      角度=弧度*180.0f/3.14159f
      向量旋转应用:
      static function RotateTowards (from :Vector3, to : Vector3, maxRadiansDelta : float, maxMagnitudeDelta : float) :Vector3
      解释:将向量from向to向量旋转maxRadiansDelta弧度变化maxMagnitudeDelta幅度(长度)。
      maxRadiansDelta是选择的弧度(不是角度哦)

    2.向量旋转(之前不懂上面那个函数的时候,到处找公式自己写旋转-.-)
      对于p = (x,y)这个向量向逆时针旋转且大小不改变所得到的向量如下:
        p: (x,y) --------> p': (x*cos(d)-y*sin(d) , x*sin(d)+y*cos(d) )
      如果是向顺时针旋转则:
        p: (x,y) --------> p': (x*cos(-d)-y*sin(-d) , x*sin(-d)+y*cos(-d) )

    3.向量相乘
      点乘,得到的是内积是实数  
      差乘,得到的是外积是向量,垂直于原向量的平面(右手法则)

    向量a·向量b=a1a2+b1b2+c1c2 
    向量a×向量b= 
    | i j k| 
    |a1 b1 c1| 
    |a2 b2 c2| 
    =(b1c2-b2c1,c1a2-a1c2,a1b2-a2b1) 
      
    4.复数乘法的几何意义(这个才叫困扰我n久的东西,阿杜当年也不重点讲下-,-)
      复数乘法(叉乘)的几何意义实际上就是对复数进行旋转
      对最简单的复数p= x + yi来说,和另一个复数q = ( conα,sinα)相乘,则表示把p沿逆时针方向旋转α:
      p’ = pq


    来源于:http://www.iu3d.com/viewtopic.php?f=24&t=100

    控制输入系统 - Input 类实例讲解

    Unity 3D 2010-07-13 13:39:59 阅读49 评论0  字号: 订阅

    获取键盘某一(这里是空格键)按键状态(bool):Input.GetKeyDown(KeyCode.Space)这是最不通用的写法,不推荐 
    获取虚拟按键(这里是Jump)按键状态(bool):Input.GetButton("Jump")推荐用这种写法,用户可以设置按键Jump为空格键(默认就是空格) 
    获 取遥感(或iphone感应)垂直轴力度(是一个0-1之间的float):Input.GetAxis("Vertical“) 推荐写法,键盘的话默认按w或者up会瞬间提到1,要是遥感的话可以控制一个度,再乘以力的方向向量的话,就可以控制汽车之类的加速了。如果你直接写成键 盘的w或者d,那就没办法控制力度了。 
    获取遥感(或iphone感应)水平轴力度(同上):Input.GetAxis("Horizontal") 
    获取鼠标中键状态:Input.GetAxis("MouseScrollWheel") 

    注:有些遥感可能水平方向会转超过1或者小于0的值出来(例如汽车遥感),为了避免错误的计算(乘以负数的话向量的方向可是会相反的),可以配合数学函数Mathf.Clamp01()来固定他的值在0和1之间。例如: 
    motor = Mathf.Clamp01(Input.GetAxis("Vertical")); //设置汽车引擎力度为垂直方向力度

    用于挥动的旗帜效果(shader)

    Unity 3D Shader 2010-07-13 10:36:46 阅读104 评论0  字号: 订阅

    //Original shader by cboe - Mar, 23, 2009 
    // Enhanced to 3 axis movement by Seon - Jan, 21, 2010 
    // 
    // Requirements: assumes you are using a subdivided plane created with X (width)* Z (height) where Y is flat. 
    // Requirements: assumes UV as: left X (U0) is attatched to pole, and Top Z(V1) is at top of pole.  
    // 
    // Enjoy! 

    Shader "Selfmade/FlagWave" 


    Properties 

        _Color ("Main Color", Color) = (1,1,1,1) 
        _MainTex ("Texture", 2D) = "white" { } 


    SubShader 

        Pass 
        { 
           CULL Off 
            
          CGPROGRAM 
          #pragma vertex vert 
          #pragma fragment frag 
          #include "UnityCG.cginc" 
          #include "AutoLight.cginc" 
            
          float4 _Color; 
          sampler2D _MainTex; 

          // vertex input: position, normal 
          struct appdata { 
              float4 vertex : POSITION; 
              float4 texcoord : TEXCOORD0; 
          }; 
            
          struct v2f{ 
              float4 pos : POSITION; 
              float2 uv: TEXCOORD0; 
          }; 
            
          v2fvert (appdata v) { 
              v2fo; 

            floatsinOff=v.vertex.x+v.vertex.y+v.vertex.z; 
            float t=-_Time*50; 
            float fx=v.texcoord.x; 
            float fy=v.texcoord.x*v.texcoord.y; 

            v.vertex.x+=sin(t*1.45+sinOff)*fx*0.5; 
            v.vertex.y=sin(t*3.12+sinOff)*fx*0.5-fy*0.9; 
            v.vertex.z-=sin(t*2.2+sinOff)*fx*0.2; 
        
              o.pos = mul( glstate.matrix.mvp, v.vertex); 
              o.uv = v.texcoord; 

             return o; 
          } 
            
          float4 frag (v2fi) : COLOR 
          { 
             half4 color = tex2D(_MainTex, i.uv); 
             return color; 
          } 

          ENDCG 

          SetTexture [_MainTex] {combine texture} 
        } 

       Fallback "VertexLit" 
    }

    鼠标控制object

    Unity 3D 2010-07-13 10:14:14 阅读43 评论0  字号: 订阅

    你鼠标转换的position是没有z值的,用鼠标控制物体的方法:
    //var target : Transform;
    var distance = 20.0;
    var mySpeed = 250.0;
    private var x = 0.0;
    private var y = 0.0;
    private var z = 0.0;
    var xMinLimit=30;
    var xMaxLimit=120;
    var yMinLimit=30;
    var yMaxLimit=120;
    var zMinLimit=30;
    var zMaxLimit=120;

    function Start () {
    var angles = transform.eulerAngles;
    x = angles.y;
    y = angles.x;
    z = angles.z;

    }

    function LateUpdate () {
    if (Input.GetMouseButton(0)){
    // x += Input.GetAxis("Mouse X") * mySpeed * 0.02;
    // x = ClampAngle(x, xMinLimit, xMaxLimit);
    y -= Input.GetAxis("Mouse Y") * mySpeed ;
    y = ClampAngle(y, yMinLimit, yMaxLimit);

    // z += Input.GetAxis("Mouse Y") * mySpeed * 0.02;
    // z = ClampAngle(z, zMinLimit, zMaxLimit);
    }
    var rotation = Quaternion.Euler(x, y, z);
    transform.rotation = rotation;
    // var position = rotation * Vector3(0.0, 0.0, -distance) + target.position;
    // 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);


    代码完全可用:使用方法就是你把脚本放进你的物体里就可以用鼠标控制。

    来源于:http://www.iu3d.com/viewtopic.php?f=16&t=235

    GUI中的图片跟随鼠标旋转,鼠标用图片代替

    Unity 3D 2010-07-13 09:50:40 阅读55 评论0  字号: 订阅

      最近要做一款类似于“祖玛”的游戏,要用到一张图像跟随鼠标旋转。所以研究了一下图片跟随鼠标旋转。
      代码不多,主要代码就是旋转角度的计算。
      var Mid : Texture2D;
      var mouse : Texture2D; //鼠标图片
      var mousePs = Vector2.zero; //鼠标的位置
      private var angle : float;
      function Update () {
       mousePs = Input.mousePosition;//获取鼠标位置
       angle = 180 - Mathf.Atan2(mousePs.x - 250,Screen.height -mousePs.y - 250) * Mathf.Rad2Deg;//计算选择角度
      }
      function OnGUI () {
       Screen.showCursor = false;
       GUIUtility.RotateAroundPivot (angle, Vector2(250,250));
      GUI.DrawTexture(Rect(200,200,100,100),Mid);
       GUIUtility.RotateAroundPivot (-angle,Vector2(250, 250));
      GUI.DrawTexture(Rect(mousePs.x,Screen.height -mousePs.y,25,25),mouse);
      }

    来源于:http://www.iu3d.com/viewtopic.php?f=18&t=9

    说明帮助GUI的制作(可以开关图片或视频)

    Unity 3D 2010-07-13 09:41:14 阅读44 评论0  字号: 订阅

    GUI.Toggle()

    gui001.jpg(64.66 KiB) 被浏览 206 次


    var mystyle : GUIStyle; 
    //定义了GUI自己更换皮肤的功能。
    var GUIx =100;
    var GUIy =10;
    var GUIyup =22;
    var GUIw =90;
    var GUIh =20;

    var toggleBool = true;
    //设置一个可见开关,并初始化为true正确。

    function OnGUI () 
    {

    toggleBool = GUI.Toggle (Rect (Screen.width-GUIx,GUIy+GUIyup*5,GUIw,GUIh),toggleBool, "help",mystyle);
    //创建一个GUI开关并等于自定义属性toggleBool项目。


    GetComponent(GUIBoxRender).enabled = toggleBool;
    //这个开关决定GUIBoxRender这个名字的脚本是否使用。
    }
    制作一个GUI开关,即Toggle按钮,这个GUI的功能是通过点击来传输true和false的功能,其输入Boolean类型。它不同于按钮Button属于执行程序功能。这个开关决定两种结果,即对和错。而Button只是决定是否启用程序,注意区分。
    其中GetComponent(GUIBoxRender).enabled这个的翻译是“获得程序脚本文件(文件名).是否允许使用”如果输入的结果是true,那么这个脚本会使用。如果输入的是false,那么这个脚本就会关闭(但不删除)。
    注意:这个GetComponent(GUIBoxRender).enabled只使用于GUI脚本,对于物体的开关需要使用renderer.enable并将脚本落在物体上。
    注意:文件名的大小写和格式不能出错。

    GUI

    var mystyle : GUIStyle; 
    var GUIx =200;
    var GUIy =10;
    var GUIyup =22;

    function OnGUI () 
    {

    GUI.Button (Rect(Screen.width-GUIx,GUIy+GUIyup*6,200,227),"",mystyle);
    }
    这个很简单,主要创建一个开关,开关除了具有按钮功能,还具有添加图片功能。并且分辨率和清晰度远远高于Teture 2D以及GUITexture的效果。
    我们只要在Mystyle的属性中的Normal中添加一个贴图即可,注意GUI.Button的大小要与制作的贴图大小一致,可以允许比例缩小。

    来源:http://www.iu3d.com/viewtopic.php?f=18&t=110
    转帖机器人,不回站内短信

    GUI里面图片的旋转(附带钟表例子)

    Unity 3D 2010-07-13 09:34:39 阅读31 评论0  字号: 订阅

    以前一直不知道在GUI里面画出的图片可以旋转,所以遇到想要旋转图片时,都是把图片贴到一个面片上,旋转面片,很是不方便,最近发现在GUI里是可以旋转图片的,所以写到这里分享给大家。下面贴一个例子,利用图片旋转写的一个钟表的代码,不废话,直接上代码。
      var Tu1 : Texture2D;
      var Time1 : float = 0;
      function FixedUpdate () {
       Time1 += Time.deltaTime;
      }
      function OnGUI () {
      GUI.Label(Rect(250,170,161,62),getTime(Time1));
       
       GUIUtility.RotateAroundPivot (6*Time1,Vector2(103, 200));
      GUI.DrawTexture(Rect(100,100,6,100),Tu1);//秒针
       GUIUtility.RotateAroundPivot (-6*Time1,Vector2(103, 200));
       
       GUIUtility.RotateAroundPivot (0.1*Time1,Vector2(103, 200));
       GUI.DrawTexture(Rect(100,120,6,80),Tu1);//分针
       GUIUtility.RotateAroundPivot(-0.1*Time1, Vector2(103, 200));
      
       GUIUtility.RotateAroundPivot(0.1/60*Time1, Vector2(103, 200));
       GUI.DrawTexture(Rect(100,140,6,60),Tu1);//时针
       GUIUtility.RotateAroundPivot(-0.1/60*Time1, Vector2(103, 200));
      }
       function getTime(time : float) : String{
       if(time<0){
       return "00:00:00";
       }
       var lastTime : String = "";
       var hour = Mathf.FloorToInt(time/3600%24);
       if(hour/10 >=1){
       lastTime+="" + hour;
       }else{
       lastTime +="0" + hour;
       }
       var minute = Mathf.FloorToInt(time/60%60);
       if(minute/10 >=1){
       lastTime+=":" + minute;
       }else{
       lastTime +=":0" + minute;
       }
       var second = Mathf.FloorToInt(time%60);
       if(second/10 >=1){
       lastTime+=":" + second;
       }else{
       lastTime +=":0" + second;
       }
       return lastTime;
      }
      简单介绍一下代码
       GUIUtility.RotateAroundPivot (6*Time1,Vector2(103, 200))为旋转GUI的代码,第一个参数为旋转的角度,第二个参数为旋转的中心点,在它之下的GUI元素都会执行该旋转,例如图片、文字等。当你只想旋 转某一GUI元素而其他元素不旋转事就得给它一个停止旋转的代码,很简单,停止旋转时给它一个反向的角度,ok。
      为了便于测试,在钟表左边给出一个数字时间经行对比。getTime(time : float)可用于实现场景中时间的显示,或者倒计时的显示等,需要的直接拿走,哈哈哈~

    来源于:http://www.iu3d.com/viewtopic.php?f=18&t=8

    在Unity中显示外部导入的txt文件

    Unity 3D 2010-07-12 16:33:26 阅读48 评论0  字号: 订阅

    var TipsText1 : String = "测试测试……";
    var TipsText2 : TextAsset;
    var GUISkin1 : GUISkin;
    function OnGUI () {
    GUI.skin = GUISkin1;
    GUI.Label(Rect(10,10,500,500),TipsText2.text);
    //~ GUI.Label(Rect(10,10,500,500),TipsText1);
    }

    在Inspector面板中把想显示的.txt内容拖到TipsText2 里。
    但是要注意的一点,从外部导入的txt文档要在Unity中重新设置一下,保证它是UTF-8的格式。
    目前TextAsset支持的文件格式有.html、.htm、.txt、.xml



    来源http://bbs.vrsh.cn/thread-3547-1-17.html

    屏幕的大小和GUI调用JS方法

    Unity 3D 2010-07-07 17:17:55 阅读51 评论0  字号: 订阅

    public var mySkin:GUISkin;
    private var wholes=false;
    private var s_width:int;
    private var s_height:int;
    private var select=true;
    function Start(){
     s_width=Screen.width;
     s_height=Screen.height;
    }
    function Update () {
    //获取播放屏幕的大小
     s_width=Screen.width;
     s_height=Screen.height;
     if(wholes){
     //设置成全屏
      Screen.fullScreen=!Screen.fullScreen;
      wholes=false;
      select=!select;
     }
    }
    function CreateWindow(windowID : int){
    GUI.skin = mySkin;
     if(select) {
      wholes=GUI.Button(Rect(0,0,200,50),"quanping");
        }else{
            wholes=GUI.Button(Rect(0,0,200,50),"tuichu");
        }
     if(GUI.Button(Rect(0,50,200,50),"open")){
      Application.ExternalCall( "openwin", "The game sayshello!" );//调用JS里的方法
     }
    }
    function OnGUI () {
    GUI.skin = mySkin;
    SliderWindowRect = GUI.Window(3,Rect(s_width-500,s_height-200,300,100),CreateWindow,"");
    }

    GUIStyle

    Unity 3D 2010-07-05 14:35:35 阅读67 评论0  字号: 订阅

    Name 名称

    The text string that can be used to refer to this specific Style文本字符串,可以用来指这一特定风格

    Normal 正常

    Background image & Text Color of the Control in default state背景图片及文字颜色控制在默认状态

    Hover 徘徊

    Background image & Text Color when the mouse is positioned over the Control背景图片及文字颜色,当鼠标在定位控制

    Active 活跃

    Background image & Text Color when the mouse is actively clicking the Control背景图片及文字颜色,当鼠标点击控制,积极

    Focused 聚焦

    Background image & Text Color when the Control has keyboard focus背景图片及文字颜色,当控制了键盘焦点

    On Normal 对正常

    Background image & Text Color of the Control in enabled state背景图片及文字颜色控制在启用状态

    On Hover 论悬停

    Background image & Text Color when the mouse is positioned over the enabled Control背景图片及文字颜色,当鼠标定位在启用控制

    On Active 主动

    Properties when the mouse is actively clicking the enabled Control属性是当鼠标点击启用积极控制

    On Focused 关于聚焦

    Background image & Text Color when the enabled Control has keyboard focus背景图片及文字颜色,当启用了键盘控制焦点

    Border 边境

    Number of pixels on each side of the Background image that are not affected by the scale of the Control' shape像素数对每个形状的一面背景图像是'不影响控制规模的

    Padding 填充

    Space in pixels from each edge of the Control to the start of its contents.每个空间的控制优势,其内容开始像素。

    Margin 边

    The margins between elements rendered in this style and any other GUI Controls.元素之间的利润呈现在这种风格和任何其他的GUI控件。

    Overflow 溢出

    Extra space to be added to the background image.要添加额外的空间的背景图片。

    Font 字体

    The Font used for all text in this style字体用于所有在此样式的文本

    Image Position图像位置

    The way the background image and text are combined.该方法的背景图片和文字相结合。

    Alignment 对准

    Standard text alignment options.标准文本对齐选项。

    Word Wrap 自动换行

    If enabled, text that reaches the boundaries of the Control will wrap around to the next line如果启用,文本,达到了控制的范围将环绕到下一行

    Text Clipping 文本剪辑

    If Word Wrap is enabled, choose how to handle text that exceeds the boundaries of the Control如果启用了自动换行,选择如何处理文本,超过控制界限的

    Overflow溢出

    Any text that exceeds the Control boundaries will continue beyond the boundaries任何文本超出了控制范围将继续超越国界

    Clip 夹

    Any text that exceeds the Control boundaries will be hidden任何文本超出控制界限将被隐藏

    Content Offset内容偏移

    Number of pixels along X and Y axes that the Content will be displaced in addition to all other properties沿X和Y轴的像素数量,该内容将在除所有其他属性流离失所

    X X

    Left/Right Offset左/右偏移

    Y ?

    Up/Down Offset向上/向下偏移

    Fixed Width 固定宽度

    Number of pixels for the width of the Control, which will override any provided Rect() value像素数为覆盖宽度的控制,这将提供的任何矩形()值

    Fixed Height 固定高度

    Number of pixels for the height of the Control, which will override any provided Rect() value像素数为重写高度的控制,这将提供的任何矩形()值

    Stretch Width 弹力宽

    If enabled, Controls using this style can be stretched horizontally for a better layout.如果启用,控制使用这种风格可以横向延伸为一个更好的布局。

    Stretch Height伸展高度

    If enabled, Controls using this style can be stretched vertically for a better layout.如果启用,控件可以使用这种风格的纵向延伸为一个更好的布局。

    http://blog.163.com/lnwanggang@yeah/blog/static/16533216220106523535136/

     

    U3D换贴图

    Unity 3D 2010-07-05 13:38:41 阅读68 评论0  字号: 订阅

     
    //如果做家具换贴图,直接把这段代码加在要换贴图的模型上即可;
    var textures : Texture2D[]; //声明一个数组型的图片库;

    private var i : float = 0; //声明i为浮点数0;

    function Update () 

       if ("这里写上发生这个事件的条件") 
       { 
          i++ //切换图片
       } 
        
       renderer.material.mainTexture = textures[i]; 
    }

    角色的上下左右移动用GUI来操作

    Unity 3D 2010-07-05 13:32:18 阅读57 评论0  字号: 订阅

    有的客户要求做触摸屏,所以做了这些。废话少说,上图、上码。

     

    Screen control.js内:

    var ButtonsActive = true; 
    var speed = 15.0;

    function OnGUI () { 
      if (ButtonsActive) {    
        if(GUI.RepeatButton(Rect(Screen.width/2,(Screen.height-45),40,40),"S")){  
        var tS = Time.deltaTime * speed; 
        transform.Translate(0,0,-tS);    
        
       } 
        
       if( GUI.RepeatButton(Rect(Screen.width/2,(Screen.height-90),40,40),"W")){ 
          
        var tW = Time.deltaTime * speed; 
        transform.Translate(0,0,tW); 
      } 
      
      if(GUI.RepeatButton(Rect(Screen.width/2-48,(Screen.height-45),40,40),"A")){ 
        var tA = Time.deltaTime * speed; 
        transform.Translate(-tA,0,0);    
      } 


      if(GUI.RepeatButton(Rect(Screen.width/2+48,(Screen.height-45),40,40),"D")){ 
        var tD = Time.deltaTime * speed;     
        transform.Translate(tD,0,0);    
         } 

      } 


    function Update () { 
      if (Input.GetKeyDown("3")) {  
        ButtonsActive = true;   
      } else if (Input.GetKeyDown("4")) { 
        ButtonsActive = false;  
      } 
    }
    来源于:http://bbs.vrsh.cn/thread-2684-1-5.html

    在Unity中设置自定义的GUI样式(方法一:只使用一个样式)

    Unity 3D 2010-07-05 12:38:04 阅读122 评论0  字号: 订阅

    首先,我们准备两张按钮状态的图片,最好是psd或者png等有透明通道的按钮,否则你无法做外发光效果和半透明效果了。我把我准备的按钮发上来。
      

    大家估计看出来了,一个是平时的样式,一个是点击的样式。

    接下来就是见证奇迹的时刻。。写代码的时刻。新建一个js脚本,并且把下面代码写进去。

    var mystyle : GUIStyle; //定义GUIStyle类型的变量 mystyle
    function OnGUI () {
    GUI.Button(Rect(0,0,124,52),"",mystyle);//绘制一个按钮,大小要参考按钮图片的分辨率。起始位置为屏幕左上角,按钮内不要文字,使用mystyle样式
    }

    保存,并且把js给到场景中任何一个gameobject上,你会发现,这个脚本下面多出了好多选项。
    ok,按下图把图片给到相应位置,其他的保持默认:
     

    好了,这是试试运行一下场景吧,效果应该出来了吧?


    来源于:http://bbs.vrsh.cn/thread-2144-1-3.html

     

     

    GUI(一)关于gui.window gui.button Scrollview(滚动视图)

    Unity 3D 2010-07-05 11:47:52 阅读103 评论0  字号: 订阅

    var scrollVec : Vector2; 
    var cls:boolean=false;
    function OnGUI(){ 

    GUI.Window(0, Rect(Screen.width-100, 35, 100, 220 ), windowF,"Management"); 
    if(cls) 
    GUI.Window(1, Rect (150, 50, 200, 200), windowjj, "Warehouse"); 





    function windowF(){ 
    GUILayout.BeginArea(Rect(4, 20, 90, 170)); 
    scrollVec = GUILayout.BeginScrollView(scrollVec); 
    if(GUILayout.Button ("Warehouse"))
    cls=true;

    GUILayout.Button("Start"); 
    GUILayout.Button("Fighting");
    GUILayout.Button("Back"); 
    GUILayout.Button("1"); 
    GUILayout.Button("2"); 
    GUILayout.Button("3"); 
    GUILayout.Button("4"); 
    GUILayout.Button("5"); 
    GUILayout.Button("6"); 
    GUILayout.Button("7"); 
    GUILayout.Button("8"); 
    GUILayout.EndScrollView(); 
    GUILayout.EndArea(); 

    GUI.DragWindow(); 
    }

    function windowjj(){
    GUILayout.BeginArea(Rect(130, 160, 50, 130));

    if(GUILayout.Button("Close")) cls=false;
    GUILayout.EndArea(); 
    }

     

     

    Unity 3d 在JS里间隔时间调用方法

    Unity 3D 2010-07-05 11:30:31 阅读101 评论1  字号: 订阅

    var text2d:Texture2D[];//放图片的数组
    private static var i:int=0;
    public var TheTime:float=0.1;播放图片的间隔
    InvokeRepeating("test",0,TheTime);
    function Update () {
    }
    function OnGUI(){
           GUI.Label(Rect(10,10,10,10),text2d[i]);
    }
    function test(){
            if(i<text2d.length-1){
                    i++;
            }
            else{
                    i=0;
            }
    }


    接受博友的意件!
    方法二:
    // Launches a projectile in 2 seconds
    var projectile : Rigidbody;
    Invoke("LaunchProjectile", 2);
    function LaunchProjectile () {
    instance = Instantiate(prefab);
    instance.velocity = Random.insideUnitSphere * 5;
    }
    每隔2秒时间调用方法LaunchProjectile

     

     

    Unity 3d界面汉化图解

    Unity 3D 2010-06-17 17:13:51 阅读261 评论0  字号: 订阅



    图解来自http://vrsh.cn

     

     

     

    Unity 3d 后代生成LineRenderer;线

    Unity 3D 2010-06-17 16:59:30 阅读66 评论0  字号: 订阅



    var aMaterial:Material;
    private var mLine:LineRenderer;
    function Start () 


        mLine = this.gameObject.AddComponent(LineRenderer); 
        mLine.SetWidth(5, 5); 
        mLine.SetVertexCount(300); 
        mLine.SetColors (Color.yellow,Color.yellow);
        mLine.material = aMaterial;//材质
        mLine.material.color = Color (0, 1, 0, 0.25);  
        mLine.renderer.enabled = true; //启用

    var i:int=0;
    function Update()
    {
        if(i<300)
        {
               mLine.SetPosition(i,Input.mousePosition);//鼠标坐标
        }
        i++;
    }

    Unity 3D 里的物体消失和显示新建

    Unity 3D 2010-06-12 10:50:42 阅读62 评论0  字号: 订阅

    var sphere1 :Transform;
    function Update () {
        
    }
    function Start()
    {
        yield WaitForSeconds(3.0);
        GameObject.Destroy(this.gameObject);
        GameObject.Instantiate(sphere1,transform.position,transform.rotation);
    }

    各种语言的转换

    Unity 3D 2010-06-11 15:25:49 阅读51 评论0  字号: 订阅


    WPF     to       Unity 3D__GUI
    http://www.zelk.com/XamlWindowGeneratorHelpMain.aspx


    javascript     to        C#:
    http://m2h.nl/files/js_to_c.php

    Unity 3D_GUI_Controls控制

    Unity 3D 2010-06-10 17:31:18 阅读429 评论0  字号: 订阅

    Label

    The Label isnon-interactive.                     该标签非交互式。 

    Itis for displayonly.                                   它是仅用于显示。

    Itcannot be clicked or otherwise moved.    它不能被点击或以其他方式移动。 

    Itis best for displaying information only.     最好是仅用于显示信息。

    /* GUI.Label example */               / * GUI.Label例如* /
    
    function OnGUI () {
            GUI.Label (Rect (25, 25, 100, 30), "Label");
    }
    
    
    
    
    按钮
    
    该按钮是一个典型的互动按钮。 It will respond a single time when clicked, no matter how long the mouse remains depressed.它会回应一个单时点击,无论多久鼠标仍然低迷。 The response occurs as soon as the mouse button is released.该反应发生只要鼠标按钮被释放。 

    BasicUsage            基本用法

    InUnityGUI, Buttons will return true when they are clicked.

    Toexecute some code when a Button is clicked, you wrap the the GUI.Buttonfunction in an if statement.

    Insidethe if statement is the code that will beexecuted when the Button is clicked.

     

    在UnityGUI,按钮将返回 true时,点击。

    /*GUI.Button example*/             / *GUI.Button例如*/ 

    function OnGUI () {
            if (GUI.Button (Rect (25, 25, 100, 30), "Button")) {
                   // This code is executed when the Button is clicked
            }
    }




    RepeatButton


    该RepeatButton 控制是一个互动,可编辑的单行字段包含一个文本字符串。

    Basic Usage       基本用法

    TheTextField will always display astring.RepeatButton                     将始终显示一个字符串。 

    Youmust provide the string to be displayed in theTextField.            您必须提供的字符串在TextField中显示。

    Whenedits are made to the string, the TextField function will return the editedstring.

    当编辑是向字符串,函数将返回的TextField编辑字符串。

    /* GUI.TextField example */             / * GUI.TextField例如* /
    var textFieldString = "text field";
    
    function OnGUI () {
            textFieldString = GUI.TextField (Rect (25, 25, 100, 30), textFieldString);
    }
    
    
    
    TextArea 
    
    textarea 控制是一种互动的,可编辑多线地区包含一个文本字符串。 

    Basic Usage基本用法

    TheTextArea will always display astring.                                  textarea将始终显示一个字符串。 

    Youmust provide the string to be displayed in theTextArea.     您必须提供的字符串显示在文本区。 

    Whenedits are made to the string, the TextArea function will return the editedstring.

    当编辑是向字符串,文本区函数将返回编辑字符串。

    /* GUI.TextArea example*/                 / * GUI.TextArea例如* /

    var textAreaString = "text area";
    
    function OnGUI () {
            textAreaString = GUI.TextArea (Rect (25, 25, 100, 30), textAreaString);
    }
    
    
    
    Toggle 
    
    该Toggle 控制创建持久的一个复选框一个开/关状态。 
    The user can change the state by clicking on it.       用户可以通过点击它的状态。 

    Basic Usage基本用法

    TheToggle on/off state is represented by a true/false boolean.

    Youmust provide the boolean as a parameter to make the Toggle represent the actualstate.

    TheToggle function will return a new boolean value if it is clicked.

    Inorder to capture this interactivity, you must assign the boolean to accept thereturn value of the Toggle function.

     

    关于切换/关闭状态由一个真/假 布尔。你必须提供一个布尔参数,使切换代表的实际状态。该切换函数将返回一个新的布尔值,如果它被点击。为了抓住这个交互性,你必须指定布尔接受的切换函数的返回值。

    /* GUI.Toggle example*/               / * GUI.Toggle例如* /

    var toggleBool = true;
    
    function OnGUI () {
            toggleBool = GUI.Toggle (Rect (25, 25, 100, 30), toggleBool, "Toggle");
    }
    
    
    
    Toolbar 
    
    工具栏按钮控制本质上是一个排。 Only one of the Buttons on the Toolbar can be active at a time, and it will remain active until a different Button is clicked.只有在工具栏上的按钮,可以将处于活动状态时,它会一直是一个积极的点击不同的按钮。 This behavior emulates the behavior of a typical Toolbar.此行为模拟了一个典型的工具栏的行为。 You can define an arbitrary number of Buttons on the Toolbar.您可以定义一个工具栏上的任意数量的按钮。 

    BasicUsage         基本用法

    Theactive Button in the Toolbar is tracked through an integer.

    Youmust provide the integer as an argument in the function.

    Tomake the Toolbar interactive, you must assign the integer to the return valueof thefunction.                            

    Thenumber of elements in the content array that you provide will determine thenumber of Buttons that are shown in the Toolbar.     

     

    工具栏上的按钮是积极跟踪,通过一个整数。 

    你必须提供一个函数作为参数的整数。 

    为了使工具栏的互动,您必须指定整数的函数的返回值。

    在数组的内容将决定您提供的是在工具栏显示的按钮数量的元素数。

    /* GUI.Toolbar example*/               / * GUI.Toolbar例如* /

    var toolbarInt = 0;
    var toolbarStrings : String[] = ["Toolbar1", "Toolbar2", "Toolbar3"];
    
    function OnGUI () {
            toolbarInt = GUI.Toolbar (Rect (25, 25, 250, 30), toolbarInt, toolbarStrings);
    }
    
    
    
    SelectionGrid
    
    该SelectionGrid控制是一个多行工具栏 。 
    You can determine the number of columns and rows in the grid.
    您可以决定列和行的网格数。 
    Only one Button can be active at time.只有一个按钮可以处于活动状态的时间。 

    BasicUsage               基本用法

    Theactive Button in the SelectionGrid is tracked through an integer.

    Youmust provide the integer as an argument in the function.

    Tomake the SelectionGrid interactive, you must assign the integer to the returnvalue of the function.

    Thenumber of elements in the content array that you provide will determine thenumber of Buttons that are shown in the SelectionGrid.

    Youalso can dictate the number of columns through the function arguments.

     

    在SelectionGrid积极跟踪按钮是通过一个整数。

    你必须提供一个函数作为参数的整数。 

    为了使SelectionGrid互动,您必须指定整数的函数的返回值。 

    在数组的内容将决定您提供的是在SelectionGrid显示按钮的数目的元素数。

    您还可以通过函数参数支配的列数。

    /* GUI.SelectionGrid example*/                         / * GUI.SelectionGrid例如* /

    var selectionGridInt : int = 0;
    var selectionStrings : String[] = ["Grid 1", "Grid 2", "Grid 3", "Grid 4"];
    
    function OnGUI () {
            selectionGridInt = GUI.SelectionGrid (Rect (25, 25, 100, 30), selectionGridInt, selectionStrings, 2);
    
    }
    
    
    HorizontalSlider
    该HorizontalSlider控制是一个典型的横向滑动旋钮,可以改变一个值拖动到预定值之间的最小和最大。 

    Basic Usage基本用法

    Theposition of the Slider knob is stored as a float.滑块的旋钮位置存储为一个浮动。 

    Todisplay the position of the knob, you provide that float as one of thearguments in the function.要显示该旋钮的位置,您提供的是,由于在函数的参数之一浮动。 

    Thereare two additional values that determine the minimum and maximum values.有两个确定的最低和最高值增加值。

    Ifyou want the slider knob to be adjustable, assign the slider value float to bethe return value of the Slider function.如果你想滑块旋钮可调,分配滑块值是浮动的滑块函数的返回值。

    /* Horizontal Slider example */                / * HorizontalSlider 例如* /

    var hSliderValue : float = 0.0;
    
    function OnGUI () {
            hSliderValue = GUI.HorizontalSlider (Rect (25, 25, 100, 30), hSliderValue, 0.0, 10.0);
    }
    
    
    VerticalSlider
    该VerticalSlider控制是一个典型的垂直滑动旋钮,可以改变一个值拖动到预定值之间的最小和最大。 

    Basic Usage基本用法

    Theposition of the Slider knob is stored as a float.滑块的旋钮位置存储为一个浮动。 

    Todisplay the position of the knob, you provide that float as one of thearguments in the function.要显示该旋钮的位置,您提供的是,由于在函数的参数之一浮动。 

    Thereare two additional values that determine the minimum and maximum values.有两个确定的最低和最高值增加值。

    Ifyou want the slider knob to be adjustable, assign the slider value float to bethe return value of the Slider function.如果你想滑块旋钮可调,分配滑块值是浮动的滑块函数的返回值。

    /* Vertical Slider example */                   /*垂直滑块的例子* /

    var vSliderValue : float = 0.0;
    
    function OnGUI () {
            vSliderValue = GUI.VerticalSlider (Rect (25, 25, 100, 30), vSliderValue, 10.0, 0.0);
    }




    HorizontalScrollbar


    该HorizontalScrollbar控制是一个滑块控件类似,但视觉元素的处理器类似滚动网络浏览器或Word。 This control is used to navigate theScrollView Control.这种控制是用于导航的滚动视图控制。

    Basic Usage基本用法

    HorizontalScrollbars are implemented identically to Horizontal Sliders with oneexception: There is an additional argument which controls the width of theScrollbar knob itself.水平滚动条来实现相同的水平滑块有一个例外:有一个额外的参数,它控制旋钮本身的滚动条的宽度。

    /* Horizontal Scrollbar example */ / *水平滚动条的例子* /
    var hScrollbarValue : float;
    
    function OnGUI () {
            hScrollbarValue = GUI.HorizontalScrollbar (Rect (25, 25, 100, 30), hScrollbarValue, 1.0, 0.0, 10.0);
    }
    
    
    VerticalScrollbar

    该VerticalScrollbar控制是一个滑块控件类似,但视觉元素的处理器类似滚动网络浏览器或Word。 This control is used to navigate the ScrollViewControl.这种控制是用于导航的滚动视图控制。

    Basic Usage基本用法

    VerticalScrollbars are implemented identically to Vertical Sliders with one exception:There is an additional argument which controls the height of the Scrollbar knobitself.垂直滚动条来实现相同的垂直滑块有一个例外:有一个额外的参数的控制旋钮的滚动条本身的高度。

    /* Vertical Scrollbar example */ / *垂直滚动条的例子* /
    var vScrollbarValue : float;
    
    function OnGUI () {
            vScrollbarValue = GUI. VerticalScrollbar (Rect (25, 25, 100, 30), vScrollbarValue, 1.0, 10.0, 0.0);
    }
    
    
    
    ScrollViews 
    
    ScrollViews是控件显示一个控件的可视区域更大设置一个。 

    Basic Usage基本用法

    ScrollViewsrequire two Rects as arguments. ScrollViews需要两个参数Rects作为。 Thefirst Rect defines the location and size of theviewable ScrollView area on the screen.第一个矩形定义大小的屏幕可视面积上滚动视图的位置和。 Thesecond Rect defines the size of the spacecontained inside the viewable area.第二个矩形定义的可视区域的大小的空间内所载。 Ifthe space inside the viewable area is larger than the viewable area, Scrollbarswill appear as appropriate.如果可视区域内的空间比可视区域大,滚动条会显示为适当。 Youmust also assign and provide a 2D Vector which stores the position of theviewable area that is displayed.您还必须指定,并提供二维矢量其中存储的可视区域显示的位置。

    /* ScrollView example */ /*滚动视图实例* /

    var scrollViewVector : Vector2 = Vector2.zero;
    var innerText : String = "I am inside the ScrollView";
    
    function OnGUI () {
            // Begin the ScrollView
            scrollViewVector = GUI.BeginScrollView (Rect (25, 25, 100, 100), scrollViewVector, Rect (0, 0, 400, 400));
    
            // Put something inside the ScrollView
            innerText = GUI.TextArea (Rect (0, 0, 400, 400), innerText);
    
            // End the ScrollView
            GUI.EndScrollView();
    }

     

    Windows 
    
    Windows是能够容器控件拖放。 They can receive and lose focus when clicked.他们可以接受和失去焦点时按下。 Because of this, they are implemented slightly differently from the other Controls.正因为如此,他们实施略有不同的其他控制。 Each Window has an id number, and its contents are declared inside a separate function that is called when the Window has focus.每个窗口有一个ID号 ,其内容是集中在一个单独的函数声明时调用该窗口的。 

    Basic Usage基本用法

    Windowsare the only Control that require an additional function to work properly. Windows是唯一的控制,需要一个额外的功能才能正常工作。Youmust provide an id number and a function name to beexecuted for the Window.您必须提供身份证号码和一个函数名被处决的窗口。 Insidethe Window function, you create your actual behaviors or contained Controls.窗口内部功能,您创建您的实际行为或包含的控件。

    /* Window example */ /*窗口的例子* /

    var windowRect : Rect = Rect (20, 20, 120, 50);
    
    function OnGUI () {
            windowRect = GUI.Window (0, windowRect, WindowFunction, "My Window");
    }
    
    function WindowFunction (windowID : int) {
            // Draw any Controls inside the window here
    }
    

    GUI.changed

    为了检测如果用户没有任何等行动(点击一个在GUI按钮,拖动滑块),读出你的脚本GUI.changed价值。 This gets set to true when the user has done something, making it easy to validate the user input.这得到设置为true,当用户做了什么,因此很容易验证用户输入。 

    Acommon scenario would be for a Toolbar, where you want to change a specificvalue based on which Button in the Toolbar was clicked.一种常见的情况是一个工具栏,在那里你想改变一个特定值的基础上的按钮在工具栏被点击。 Youdon't want to assign the value in every call toOnGUI() , only when one of the Buttons hasbeen clicked.你不希望每次调用指定的值到OnGUI(),只有当一个按钮被按下了。

    /* GUI.changed example */
    
    private var selectedToolbar : int = 0;
    private var toolbarStrings = ["One", "Two"];
    
    function OnGUI () {
            // Determine which button is active, whether it was clicked this frame or not
            selectedToolbar = GUI.Toolbar (Rect (50, 10, Screen.width - 100, 30), selectedToolbar, toolbarStrings);
    
            // If the user clicked a new Toolbar button this frame, we'll process their input
            if (GUI.changed)
            {
                   print ("The toolbar was clicked");
    
                   if (selectedToolbar == 0)
                   {
                           print ("First button was clicked");
                   }
                   else
                   {
                           print ("Second button was clicked");
                   }
            }
    }
    GUI.changed将返回true,如果任何GUI控制摆在它是用户所操纵。

    Unity 3D——GUI基础知识

    Unity 3D 2010-06-10 16:51:34 阅读128 评论2  字号: 订阅

    播放器的总尺寸:        Screen.width
                                        Screen.height
    鼠标消失:
                                        Screen.lockCursor = true;

    在浏览器打开网址:
                                         Application.OpenURL("http://unity3d.com/");
    GUI换字:
                                       GUI.skin = guiSkin;
                                       varicon=icons[Mathf.Round(Time.time*speed)%5];
                                      //返回四舍五入至最接近的整数。0、1、2、3、4、0……
                                       GUI.Button(Rect(10,10,100,100),icon);
    系统提示音:
                     function OnGUI () {
                              if (Event.current.type ==EventType.mouseDown)
                                      EditorApplication.Beep();
                    }
    场景的新建、打开、添加:(参数为路径)

    ·        EditorApplication.NewScene 
    Create a new scene

    ·        EditorApplication.OpenScene 
    Opens the scene at path.

    ·        EditorApplication.OpenSceneAdditive 
    Opens the scene at path additively.



    控件同时有图片和文字:

                         var icon : Texture2D;
                         function OnGUI () {
                             GUI.Box (new Rect(10,10,100,50),new GUIContent("This is text", icon));
                         }

    控件闪烁:          
                         function OnGUI () {
                             if (Time.time % 2 < 1) {
                                if (GUI.Button (new Rect(10,10,200,20), "Meet the flashing button")) {
                                    print ("You clicked me!");
                                }
                             }
                         }
                         //可以利用这个让控件消失

    使用GUIContent来显示字符串,图标,工具提示:
                         /* Using GUIContentto display an image, a string, and a tooltip */

                         var icon :Texture2D;

                         function OnGUI () {
                               GUI.Button (new Rect(10,10,100,20),new GUIContent ("Click me", icon, "This is thetooltip"));
                               GUI.Label (new Rect(10,40,100,20), gui.tooltip);
                         }
    官方位置:http://unity3d.com/support/documentation/Components/gui-Basics.html

     

    添加网格碰撞

    Unity 3D 2010-06-08 11:15:22 阅读52 评论0  字号: 订阅

    /*============================================================
     * creat by panda 20100421
     * ============================================================
     */
    @MenuItem ("anda/AddMeshCollider %9")
    static function Init () 
    {
        var selScripts = new Array();
        selScripts = Selection.objects; //你所选择的对象集合(GameObject)
        for (i = 0; i < selScripts.length; i++) {
                varcomponents = new Array();
                components =selScripts.GetComponentsInChildren(MeshRenderer);   //获取所有含有MeshReader的子对象。
                for (j = 0;j < components.length; j++) {
                       components[j].gameObject.AddComponent("MeshCollider");         //添加触碰
                }
        }
    }

    MovieTexture视频贴图(在Unity中简单实现视频播放)

    Unity 3D 2010-06-05 15:20:39 阅读61 评论0  字号: 订阅

    首先拷贝一个视频文件到Assets文件夹内,确保这个视频的类型是U3D承认的类型。
    创建要播放这个视频的物体,比如一个Plane。
    为这个物体增加Material材质,并将Movie视频文件给与贴图(有时候你会发现是黑色,那是因为视频没有启动,只要选择视频文件在Preview观看中进行系统播放一下就可以显示出贴图)。
    然后创建JavaScript脚本。
    functionStart () 
    {
    renderer.material.mainTexture.Play();
    }
    内容如上。
    这个也可以在官方帮助中选择Scripting中搜索Play然后选择MovieTexture.Play找到。
    将这个脚本给与播放视频的物体即可。


    在图中可以打开Loop进行视频循环播放,你开始运行程序即可看到视频在播放。
    经过实验表明大部分经过其它软件压缩的视频都可以使用,并且U3D还能自行调整视频质量。

    摘自:http://bbs.vrsh.cn/thread-3162-1-2.html

    Unity3D开发者常见问题20条

    Unity 3D 2010-06-05 10:32:45 阅读57 评论2  字号: 订阅

    1:天空盒有接缝怎么解决?
    答:在贴图导入设置里设置Wrap Mode为"Clamp".

    2:DDS格式怎么不显示?
    答:Unity不支持DDS格式,Unity会将除DDS外的其他格式图片具有为DDS同样的优化.

    3:Unity如何动态载入外部模型等文件?
    答:可以使用AssetBundle:http://unity3d.com/support/documentation/ScriptReference/AssetBundle.html

    4:脚本编辑器有语法提示吗?
    答:有的,Win版使用Ctrl+I,Mac版使用Ctrl+>.

    5:如何使用烘焙贴图(多重纹理)?
    答:不要使用Shell贴图,直接将烘焙图赋予贴图的"自发光"通道之上.

    6:怎么屏蔽Webplayer右键菜单?
    答:<paramname="disableContextMenu" value="true" />

    7:为什么水面没有实时反射效果?
    答:只有专业版才支持这种反射效果.

    8:怎么做摄像机漫游动画?
    答:Max正常制作摄像机漫游动画,倒到Unity中后,将Unity的Camea拖拽到Max导出的摄像机Gameobject物体之上,作为其子物体即可.

    9:如何自定义Webplayer载入Logo及进度条?
    答:<param name="logoimage"value="Logo文件名" />,<paramname="progressbarimage" value="进度条名" />,<param name="progressframeimage" value="进度条外框名" />.

    10:GUI上怎么使用中文字?
    答:导入任意中文字体,然后定义GUISkin字体为该字体即可.

    11:购买一个授权可以安装几台电脑?
    答:可以安装于2个系统之上比如一个Win版一个Mac版.

    12:Max文件扔到Unity中怎么说导入失败?
    答:下载最新版Fbx插件,用Max导出Fbx文件然后扔Unity中.

    13:如何不让摄像头穿透模型,离模型近了就像模型露面了?
    答:设置相机的Near clipplane,调小一点,但是不要给负数.

    14:怎么用双面贴图?
    答:Unity中可设置双面Shader,最简单有效的办法是直接做成双面的实体模型.

    15:导入的Fbx模型尺寸小于Max中的尺寸?
    答:在Unity中该文件的导入设置中设置缩放因子为1.

    16:如何给相机添加Glow效果?
    答:选中相机对象,在菜单中选中Component-Image Effects-Glow赋予该组件即可(专业版才支持此特效)

    17:怎么设置Webplayer默认尺寸?
    答:到菜单Edit-ProjectSettings-Player中设置Default Web Screen尺寸即可.

    18:怎么设置可执行文件的启动Banner?
    答:到菜单Edit-ProjectSettings-Player中设置Resolution Dialog Banner.

    19:如何设置雾效?
    答:到菜单Edit-RenderSettings中开启Fog及设置Fog Color等即可.

    20:如何设定默认Skybox天空盒?
    答:到菜单Edit-RenderSettings中设置Skybox Material即可.

     

     

    引用:http://www.to3d.com/3dtech/show-1854-1.html

    Unity教学视频网址(buzz大叔)

    Unity 3D 2010-06-05 10:30:14 阅读59 评论0  字号: 订阅

    http://www.3dbuzz.com/vbforum/sv_videonav.php?fid=808bf515c69066eb13df7952c0d54711

    [Unity3D]深度相机 Depth Camera(在屏幕中做小屏幕用)

    Unity 3D 2010-06-05 10:27:00 阅读95 评论0  字号: 订阅

    作为3D世界里最重要的窗口,摄像机的应用就显得很重要,毕竟在屏幕上看到的一切都得用摄像机矩阵变换得来的嘛。

    论坛上看到了一篇帖子讲非天空盒的背景做法,让我想起其实很多界面合成画面可以用摄像机之间的交互来实现(避开用GUI,效率问题我没尝试过,但是貌似用深度相机比gui好?以后试验下)。

     

    首先说下深度相机,就是用2个或者2个以上的相机,设置好参数后自动到屏幕视觉合成的效果,应用上两个方面:1,背景图 2,用户界面。

     

    步骤:

    1.建立第二个相机,设置 Clear Flags 属性为 Depth Only (深度模式)

    把摄像机和摄像机面前要投影的东西放到场景以外开不到的地方。

     

    2.设置Depth属性

    主摄像机默认是-1 ,如果你的物体要显示在他层面之上,就设比他大的数,不然就设比他小的数

     

    3.设置贴图的Aniso Level属性到最高(9)

    这样贴图就能清晰些。

     

    4.最后去处摄像机自带的没用的组件

    去除掉Audio Listener之类的东西。

     

     

    放前面当界面用,放背后可以当背景,做些什么远处的树啊山啊之类的不错。

    这样的话,车仪表盘指针就可以编程让他动了。 ^ ^

     

     

    摘自:http://user.qzone.qq.com/175707544/blog/1250656726

    Unity3D使用C#实现Coroutines & Yield(转)

    Unity 3D 2010-06-05 10:24:28 阅读38 评论0  字号: 订阅

    Coroutines& Yield是Unity3D编程中重要的概念,它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行,但是在Javascript与C#中实现Coroutines& Yield,在语法上却有一些区别:

    yield不可单独使用 
    需要与return配合使用,例如:

    1 yieldreturn 0; //等0帧 

    2 yieldreturn 1; //等1帧 

    3 yieldreturn WaitForSeconds(3.0); //等待3秒

    所有使用yield的函数必须将返回值类型设置为IEnumerator类型,例如:

    1IEnumerator DoSomeThingInDelay() {...}

    最后,也是在”Using C#”这个章节中没有讲到的关键一点是,所有IEnumerator类型函数必须使用”StartCoroutine”这个函数触发,不能单独使用,例如:

    1StartCoroutine(DoSomeThingInDelay());

    最后附上学习Coroutines & Yield时所做的小例子,脚本的作用是不断随机改变材质的颜色,演示demo使用”V字仇杀队”中的面具。

    using UnityEngine; 

     using System.Collections; 

       

     public class RandomColor : MonoBehaviour { 

       

      public float delayInSecond = 1; 

      public Material targetMaterial; 

       

      // Use this for initialization 

      void Start () { 

      StartCoroutine(AutoChangeColor()); 

      } 

       

      // Update is called once per frame 

      void Update () { 

      } 

       

      IEnumerator AutoChangeColor() 

      { 

      yield return 0; //确保Time.deltaTime为0 

       

      Color colorNew = GenerateRandomColor(); 

      Color colorNow =targetMaterial.GetColor(&amp;quot;_Color&amp;quot;); 

      float timeEclapsed = 0; 

      for (timeEclapsed = 0; timeEclapsed &amp;lt; delayInSecond;timeEclapsed += Time.deltaTime) 

      { 

      float progress = timeEclapsed / delayInSecond; 

      Color colorTween = new Color( 

      (colorNew.r - colorNow.r) * progress + colorNow.r, 

      (colorNew.g - colorNow.g) * progress + colorNow.g, 

      (colorNew.b - colorNow.b) * progress + colorNow.b 

      ); 

      targetMaterial.SetColor(&amp;quot;_Color&amp;quot;, colorTween); 

      yield return 1; 

      } 

       

      StartCoroutine(AutoChangeColor()); 

      } 

       

      Color GenerateRandomColor(){ 

      Color color = new Color(); 

      color.r = Random.value; 

      color.g = Random.value; 

      color.b = Random.value; 

       

      return color; 

      } 
     }

    摘自:http://www.unity3d8.com/content/unity3d%E4%BD%BF%E7%94%A8c%E5%AE%9E%E7%8E%B0coroutines-yield%E8%BD%AC

     

    展开全文
  • 游戏发布,语言本地化需要繁体中文和简体中文 iOS8版本之前没问题,iOS9上无法正常识别这两种语言

    本文转载于:http://blog.csdn.net/teng_ontheway/article/details/50277169

    游戏发布,语言本地化需要繁体中文和简体中文

    iOS8版本之前没问题,iOS9上无法正常识别这两种语言

    原因是在iOS9上,Unity通过Application.systemLanguage返回的简体中文和繁体中文都是SystemLanguage.Chinese,真尼玛坑爹啊,摔手机砸电脑~

    亲测Unity 5.2.1、Unity 5.3都有这个问题,Unity更新日志中都没有见这方面消息,不知是没人重视还是没人提~


    原因分析:

    [plain] view plain copy
    1. 语言          iOS返回语言         Application.systemLanguage  
    2.   
    3. ios 7  
    4. 简体中文            zh-Hans             ChineseSimplified  
    5. 繁体中文            zh-Hans             ChineseSimplified  
    6.   
    7. ios 8.1  
    8. 简体中文            zh-Hans             ChineseSimplified  
    9. 繁体中文(香港)        zh-HK               ChineseTraditional  
    10. 繁体中文(台湾)        zh-Hant             ChineseTraditional  
    11.   
    12. ios 9.1  
    13. 繁体中文            zh-Hant-CN          Chinese           
    14. 简体中文            zh-Hans-CN          Chinese  
    15. 繁体中文(香港)        zh-HK               ChineseTraditional  
    16. 繁体中文(台湾)        zh-TW               Chinese  


    可见苹果在iOS9上都做了什么鬼处理......


    解决方法:

    如果Application.systemLanguage返回的是chinese,直接通过C#调用ObjC函数获得当前iOS系统语言进行纠正

    [csharp] view plain copy
    1. using UnityEngine;  
    2. using System.Collections;  
    3. using System.Runtime.InteropServices;  
    4.   
    5. public class ComManager  
    6. {  
    7.     [DllImport("__Internal")]  
    8.     // ios手机的当前语言 "en"、“zh"、“zh-Hans"、"zh-Hant"  
    9.     private static extern string CurIOSLang();  
    10.   
    11.     /** 
    12.         获得校正后的系统语言 
    13.         因为ios9调整了系统语言,简体中文和繁体中文在ios9上Application.systemLanguage获取的值都是Chinese 
    14.         无法区分简体中文和繁体中文 
    15.  
    16.         ios 7 
    17.         简体              zh-Hans 
    18.         繁体              zh-Hant 
    19.  
    20.         ios 8.1 
    21.         简体中文            zh-Hans             ChineseSimplified 
    22.         繁体中文(香港)        zh-HK               ChineseTraditional 
    23.         繁体中文(台湾)        zh-Hant             ChineseTraditional 
    24.  
    25.         ios 9.1 
    26.         简体中文            zh-Hans-CN          Chinese 
    27.         繁体中文(香港)        zh-HK               ChineseTraditional 
    28.         繁体中文(台湾)        zh-TW               Chinese 
    29.     **/  
    30.     public static SystemLanguage GetSystemLanguage()  
    31.     {  
    32.         SystemLanguage lang = Application.systemLanguage;  
    33.         if (Application.platform == RuntimePlatform.IPhonePlayer)  
    34.         {  
    35.             if (lang == SystemLanguage.Chinese) {  
    36.                 string name = CurIOSLang();  
    37.                 if (name.StartsWith("zh-Hans")) {  
    38.                     return SystemLanguage.ChineseSimplified;  
    39.                 }  
    40.   
    41.                 return SystemLanguage.ChineseTraditional;  
    42.             }  
    43.         }  
    44.   
    45.         return lang;  
    46.     }  
    47. }  


    有朋友问上面生命的的CurIOSLang函数怎么来的,是在Objective-C中定义好的,C#中声明引用,具体可以看文章最后的Unity的C#和ObjC数据交互

    定义一个.mm文件,内容如下:

    [objc] view plain copy
    1. extern char* cStringCopy(const char* string);  
    2.   
    3. extern "C"  
    4. {  
    5.     // ios手机的当前语言 "en"、“zh"、“zh-Hans"、"zh-Hant"  
    6.    const char* CurIOSLang()  
    7.    {  
    8.         NSArray *languages = [NSLocale preferredLanguages];    
    9.         NSString *currentLanguage = [languages objectAtIndex:0];   
    10.         return cStringCopy([currentLanguage UTF8String]);  
    11.    }  
    12. }  


    相关资料:

    Unity的C#和ObjC数据交互  http://blog.csdn.net/teng_ontheway/article/details/50182217

    iOS获得当前系统语言 http://blog.csdn.net/teng_ontheway/article/details/50276987

    【Unity语言国际化】多语言缩写对应表 http://blog.csdn.net/teng_ontheway/article/details/48293617


    展开全文
  • 整个打包流程与Android打包是类似的。 难点主要集中在插入必要的FrameWork,修改Plist 在Unity5.x上Unity官方已经帮我们...在Unity4.x上使用这套API可以去下载Unity官方提供的代码Unity-Technologie / XcodeAPI...
  • 已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。 前段时间,一直给开发者灌输学习3D游戏引擎技术,包括游戏底层数据结构封装,算法与游戏实战技术分享课程...
  • 重要提示: Unity 2017开始已经支持到.net 4.5了!!! 可以接入单反的SDK了!!我也很久没有做单反的接入了,所以不要问我了。 关于SDK,中国是没有被允许对主流单反的...之前已经在unity3d做了一款成品软件 无奈由于u3d...
  • 常见编程/框架介绍

    2019-07-07 18:08:37
    一、C/C++二、C#三、cocos2d-x四、go语言五、Hadoop六、HBase七、PHP八、python九、Spark十、Storm十一、Unity3D十二、Java十三、Android十四、Object-C与swift十五、.NET十六、R语言 一、C/C++ 1. 简介 C语言是...
  • Unity API - A

    2017-02-09 20:09:48
    Unity API - A
  • 转自eseedo的博客 作者微博   前言 ...iOS7 beta发布后,大部分开发者和用户的注意力都集中在了iOS 7的全新UI交互设计界面上。一直负责硬件工业设计的Jony Ive首次全面负责苹果的软件和硬件设计工作,自然要把...
  • 初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 ...初探使用iOS 7 Sprite Kit与Cocos2d开发游戏的对比 ...前言 iOS7 beta发布后,大部分开发者和用户的注意力都集中在了iOS 7的全新UI交互设计界面上。...
  • 博主最近在学习Unity,发现一个英文教程很好。这个教程通过一个个小项目讲解了Unity方方面面,包括编辑器的使用,脚本的开发,网格基础, 渲染和Shader等等,而且是由浅入深介绍的。这个教程是荷兰的独立软件开发...
  • 下载地址 最后更新共计113个分类5177套源码...│ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签的灵活运用.rar │ │ Android 实现 标签 拖动 改变位置.rar │ │ android 流式布局和热门标签.zip │ │ ...
  • 面试题

    2018-06-28 21:29:47
    一、 C#语言1. 重载和重写的区别 1) 所处位置不同 重载在同类中 重写在父子类中2) 定义方式不同 重载方法名相同 参数列表不同 重写方法名和参数列表都相同3) 调用方式不同 重载使用相同对象以不同参数...
  • 在服务器端程序开发领域,性能问题一直是备受关注的重点。业界有大量的框架、组件、类库都是以性能为卖点而广为人知。然而,服务器端程序在性能问题上应该有何种基本思路,这个却很少被这些项目的文档提及。...
1 2 3 4 5 6
收藏数 106
精华内容 42
热门标签