unity3d的系统组件

2019-08-05 19:47:42 qq_39588003 阅读数 245
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

虽然系统已经提供了许多高级控件,但还是无法满足项目中的一些特殊需求,这时可以通过自定义风格组件来实现。

在创建的“GUI Skin”中的“Inspector”视图中展开“Custom Style”下拉菜单项,然后在“Size”中输入修改自定义风格组件的数量,并为各个组件取名。然后可将各个自定义组件展开进行设置。

示例1:未设置自定义组件

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

public class ButtonSystem : MonoBehaviour {

    public GUISkin mySkin;  //自定义皮肤
	void OnGUI()
    {
        GUI.skin = mySkin;  //设置GUI皮肤为自定义的皮肤

        GUI.Button(new Rect(10, 10, 50, 20),"按钮1");
        GUI.Button(new Rect(10, 40, 50, 20), "按钮2");
        GUI.Button(new Rect(10, 70, 50, 20), "按钮3");
        GUI.Button(new Rect(10, 100, 50, 20), "按钮4");
        GUI.Button(new Rect(10, 130, 50, 20), "按钮5");
    }
}

运行结果,五个按钮的样式相同:

 

示例2:设置了自定义组件

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

public class ButtonSystem : MonoBehaviour {

    public GUISkin mySkin;  //自定义皮肤
	void OnGUI()
    {
        GUI.skin = mySkin;  //设置GUI皮肤为自定义的皮肤
        GUI.Button(new Rect(10, 10, 50, 20),"按钮1","Custom1");
        GUI.Button(new Rect(10, 40, 50, 20), "按钮2", "Custom2");
        GUI.Button(new Rect(10, 70, 50, 20), "按钮3");
        GUI.Button(new Rect(10, 100, 50, 20), "按钮4");
        GUI.Button(new Rect(10, 130, 50, 20), "按钮5");
    }
}

运行结果,“按钮1”和“按钮2”设置了不同的风格,所以显示的风格与其它的不同

2016-05-07 00:28:15 u014581901 阅读数 0
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Refer to the information on these pages for details on working in-depth with various aspects of Unity.

这些页面的参考信息,是有关Unity深入工作的各个方面的详细信息。

The Unity Manual Guide contains sections that apply only to certain platforms. Please select which platforms you want to see. Platform-specific information can always be seen by clicking on the disclosure triangles on each page.

注意,手册的有些章节只适用特定的平台,在方框中标记的。

Desktop 桌面

iOS

2017-07-20 10:26:02 zhi_fei 阅读数 2895
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

组件(Component)这个概念最早是在2005年《Game Programming Gems 5》的《Component Based Object Management》中接触到的,当时感觉在设计上很实用。后来,发现Unreal Engine 3的一个重要的改进就是抛弃了以前的基于纯派生关系的对象模型,而转为使用基于组件的对象模型。对于这种设计思想,Unity比Unreal贯彻的更彻底——一切皆Component。

那么到底什么是“基于组件”的对象模型?它能够解决什么问题?

在传统的设计中,我们一般会使用“派生”来描述对象之间的关系。子类通过派生父类,来获得父类的功能。在设计游戏对象时,会根据游戏本身的需要而为游戏对象添加各种功能支持,比如渲染,碰撞,刚体,粒子系统等等。这些通用功能为了能够为各种派生类提供服务,都必须实现到基类中。这样就导致了游戏对象基类变得非常庞大臃肿,即难使用,又难维护。

”基于组件“的对象模型就是把所有需要提供给游戏对象的基础功能都独立成单独的”组件模块“(Component),一个具体的游戏对象可以将它需要的功能模块组合到一起使用。所有”功能“不再是父类中的接口,而变成子对象实例,为游戏对象提供服务。这样既保证了功能代码的可重用性,又增加了整个对象体系的模块化和灵活度。

在Unity中,GameObject除了作为Component的容器之外,基本上没有其他功能。所有需要的功能都要通过组合Component来实现。脚本本身也是Component,用来在GameObject上通过控制其他Component来实现自定义的功能。虽然这些Component在物理上是完全并列的关系,但是他们之间还是会有一定的层次关系的。在设计一个游戏对象的具体功能时,组件一般会被分为三个层次。

引擎的基础组件

Unity本身提供的各种内部功能组件。比如渲染组件,物理组件,声音组件等等。这些组件实现了所有引擎提供的基础功能,会被脚本使用来组合高级功能。

模块功能脚本组件

通过脚本实现的一些相对独立的通用模块功能的组件。这类组件的设计是脚本可重用的关键,需要仔细分析游戏对象中哪些功能可以被独立出来成为一个可重用的功能模块组件,并且在实现上应该尽量降低与其他组件的耦合性。比如在设计一个角色游戏对象时,需要为他设计换装功能。换装功能其实就是对显示子对象进行分组管理,切换显示状态。这个功能相对独立,与其将他实现到角色中,不如独立成一个功能模块组件。角色游戏对象和其他所有需要换装功能的游戏对象都可以通过包含这个模块组件来实现换装功能。

模块功能组件之间还可能有依赖关系,也就是一个功能模块组件可能依赖与另一个功能模块组件,从而在这个组件层次上形成更多的子层次。

高层的胶水代码脚本

这些脚本用来真正将引擎基础组件和模块功能组件组合到一起实现最终游戏对象逻辑。用“胶水代码”来形容这些脚本非常的贴切,就是把所有这些子功能“粘”在一起。比如设计一个Player脚本,将所有需要的组件功能组合起来,实现一个玩家的具体游戏逻辑。因为这一层次代表的都是最高层的游戏行为控制对象,是具体的游戏逻辑的“胶水”代码,不会再为更上层提服务,所以本身的可重用性并不高。但是这些对象之间按照类型区分,往往会有一些功能上的重合,所以反而可以继续使用派生关系来实现功能的重用。比如在Character中实现所有的基础功能(这些功能又是通过组合基础组件来实现的),而Player和NPC都从Character派生,来继承所有Character的功能,并继续实现自己特殊的功能。一个功能到底应该用组件实现还是用派生实现并没有非常明确的界限,应该根据需要灵活运用。

在使用Unity的过程中,如果要实现的是demo级别的小工程,并不需要考虑很多,直接用脚本实现功能就可以了。但是如果要有效地组织复杂的工程,提高代码的重用性,充分理解和合理的利用“基于组件”的对象模型设计思想还是很重要的。

2017-04-24 16:45:53 Silk2018 阅读数 0
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

扩展系统组件方便调用提高效率

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

public static class Extension : MonoBehaviour {
    

    public static void setPosX(this Transform trans, float x)
    {
        trans.position = new Vector3(x,trans.position.y,trans.position.z);
    }
}


2016-09-27 18:04:32 fansongy 阅读数 6291
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。


文章作者:松阳

本文出自 阿修罗道,禁止用于商业用途,转载请注明出处。  

原文链接:http://blog.csdn.net/fansongy/article/details/52683181







作为Unity3d新版本的UI系统,UGUI以其易用性,逐渐被多数团队所接纳。但随着应用的深入,团队中总有需要自定义一套UI系统的需求。所幸UGUI是一个开源项目,可以在Unity3d的官方的Bitbucket代码库中找到源码。有了源码当然我们可以采用一劳永逸的办法,重编DLL库,并替换掉Unity\Editor\Data\UnityExtensions\Unity\GUISystem\UnityEngine.UI.dll,实现重写。但我还是不太推荐这样,因为一旦如此做,就无法跟随Unity3d版本升级了。因此本文主要介绍如何通过子类实现重写.

整体思路

首先推荐去官网下载一份代码。总体上看来大概分为以下几个部分:

  • UnityEngine.UI/UI/Core/DefaultControls是创建具体控件的层级与属性设置。
  • UnityEditor.UI/UI/MenuOptions是具体创建控件的包装方法。
  • UnityEditor.UI/UIUnityEngine.UI/UI/Core这两部分是对应的控件实现。

因此整体上重写的思路为:

  1. 为每个控件包装一个子类
  2. 创建时更改创建的脚本设置
  3. 重定向点击菜单按钮的生成

更改文字组件

下面以Text为例,重写一个组件。首先要创建一个子类:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class MyText :  Text
{

}

弄个空的就好了。

然后更改MenuOption类,由于这个类是Inner的,没有办法重写。所以我就将源码复制了一份。由于Unity会优先编译DLL后编译代码,所以复写public static 的菜单注册函数也不会有问题。

最后创建一个DefaultControls的复写类,将源码中创建Text的逻辑复制出来。

public class MenuOptionOverwrite
{
    //...
    [MenuItem("GameObject/UI/Text", false, 2000)]
    static public void AddText(MenuCommand menuCommand)
    {
        GameObject go = DefaultControlsOverwrite.CreateText(GetStandardResources());
        PlaceUIElementRoot(go, menuCommand);
    }
    //...
}

public static class DefaultControlsOverwrite 
{
    //...
    public static GameObject CreateText(DefaultControls.Resources resources)
    {
        GameObject obj2 = CreateUIElementRoot("Text", s_ThickElementSize);
        Text lbl = obj2.AddComponent<MyText>();
        lbl.text = "New Text";
        SetDefaultTextValues(lbl);

        lbl.raycastTarget = false;
        return obj2;
    }
    //...
}

经过这样更改在Hierarchy中创建UI组件时,就会直接创建名为MyText的组件。至于直接把DefaultControls里面的代码复制出来,有利有弊,直接复制出来改起来比较方便,但如果Unity3d升级之后,代码更改可能会遗漏。反过来,先调用DefaultControls的接口,回头再将脚本换掉也可以,但这样就涉及到组件的赋值,写起来可能会特别傻 其中利弊大家自己衡量吧

创建效果


右键创建Text就直接是这个效果,而且可以自定义属性,比如这里我们就默认将Raycast勾掉啦

如果你觉得这篇文章对你有帮助,可以顺手点个,不但不会喜当爹,还能让更多人能看到它...