1.Unity GUILayout.Button
2.Unity3D中自动调用的数源数源方法总结
3.云南华软学校 Unity 3D 实践案例一
4.å¦ä½ç¨unity3dç¼åjavascript
5.Unity 按一次键,为什么OnGUI中的码函部分函数会多次响应?
Unity GUILayout.Button
在Unity的EditorWindow子类的OnGUI()函数中,调用GUILayout.Button可以绘制按钮。代码默认情况下,数源数源按钮会占据整个可用空间。码函若希望按钮仅覆盖文字,代码spr源码可调整其大小。数源数源实现方法如下:
若需绘制数字输入框,码函使用GUILayout.FloatField。代码该方法能够创建一个用于输入数字的数源数源控件。
若目标是码函绘制进度条,调用GUILayout.HorizontalSlider能完成该任务。代码通过滑动操作,数源数源用户可以调整进度条的码函足疗网站源码值。
在C#中,代码将string转换为float,可以通过隐式类型转换完成。例如,将字符串s转换为float,只需写作float f = s;无需额外的转换函数。
总结,Unity的GUILayout库提供了丰富的控件绘制功能。通过调用相应的方法,可以轻松地在Unity环境中实现按钮、输入框、进度条等界面元素。同时,源码 反码 补码定义C#中字符串到数字的转换也极为简便,只需利用类型转换即可实现。
Unity3D中自动调用的方法总结
在Unity3D中有一些方法不是程序员手动调用的,而是Unity3d工具自身设计时就决定自动调用的,不过调用的时机和场合不同,下面就一一介绍一下:Awake:顾名思义,Unity3D的脚本苏醒时需要调用的方法,这个方法比Start方法执行的还要早,也是执行一次。
Start:可以理解为类的构造函数,或者是init函数,用于初始化各种变量,仅执行一次。c 类例子源码
Update:类似于flash AS3 onframe的回调函数,每帧均回调。
Fixedupdate:每一帧都执行,处理Rigidbody时,需要用FixedUpdate代替Update。例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧。(两者帧长不同)FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的漫画软件源码 js计算,因为是跟每帧渲染有关。Update就比较适合做控制。
Lateupdate:每帧均回调,但每次均在Update之后再调用。
OnGUI:每帧均回调,用于绘制GUI对象。
Reset:用户点击检视面板的Reset按钮或者首次添加该组件时被调用。此函数只在编辑模式下被调用。Reset最常用于在检视面板中给定一个最常用的默认值。
OnDisable:当物体被销毁时 OnDisable将被调用,并且可用于任意清理代码。脚本被卸载时,OnDisable将被调用,OnEnable在脚本被载入后调用。注意: OnDisable不能用于协同程序。
OnDestory:当MonoBehaviour将被销毁时,这个函数被调用。OnDestroy只会在预先已经被激活的游戏物体上被调用。注意:OnDestroy也不能用于协同程序。
云南华软学校 Unity 3D 实践案例一
云南华软学校,受教育部、工信部与人社厅三部委直管与扶持的现代职业教育院校,以互联网计算机为王牌专业,开设多维软件工程、全链路UI设计、影视动漫、大数据应用、人工智能应用与跨境电商等专业。游戏场景中的物体均为游戏对象,可通过脚本控制实现对象间的交互。
创建游戏对象有多种方法,本案例选用脚本动态创建。具体步骤为使用脚本在Unity 3D中生成Cube和Sphere模型,并为每个模型添加刚体、颜色和位置属性。通过屏幕左上角的按钮执行操作。
在案例中,C#脚本在OnGUI()函数中,实现创建Cube或Sphere游戏对象。创建后,制作组件,批量应用工作,如制作“敌人”、“士兵”、“子弹”等预制体。预制体存储游戏对象及其所有组件,包括子游戏对象。
制作预制体时,先在场景中创建立方体,然后在Project面板中创建预制体,并命名为MyCube。在Hierarchy视图中,将立方体拖至Project视图中的MyCube,完成预制体制作,与立方体关联,关联游戏对象变为蓝色。
实例化预制体,即将预制体复制到场景中,可通过Project面板拖至Inspector面板实现。实例化非普通复制,新游戏对象与预制体关联,预制体的修改会直接影响实例化的游戏对象。
代码中使用Instantiate方法实例化游戏对象,与CreatePrimitive方法创建游戏对象功能相同。实例化游戏对象将脚本及所有继承关系实例化到游戏场景中,效率远高于CreatePrimitive方法。
开发中,通常使用Instantiate方法实例化对象,与预制体结合使用。云南华软学校,出品于校委宣传部。
å¦ä½ç¨unity3dç¼åjavascript
Unityä¸çJS,ä¹ç§°UnityScript,ååºäºæµè§å¨çJSææ¯è¾å¤§çåºå«ï¼å 为UnityScriptæ¯åºäºMonoç.net çILè¯è¨è§èï¼CLRè¿è¡ç¯å¢(Monoèææº)ä¸è®¾è®¡çè¯è¨ã
0.åºæ¬æ¦å¿µï¼
Unity3dä¸çèæ¬å¯ä»¥ä¸æ¸¸æ对象é¾æ¥ï¼åéæ°å¼çä¿®æ¹ä»¥åå®æ¶é¢è§èæ¬ä¿®æ¹åç游æææï¼èçäºå¾å¤èæ¬è°æ´åè°è¯çæ¶é´ï¼æé«äºå¼åæçã
ç®åç项ç®åUnityä¸ç大éä¾ååèæ¬èµæºå é½æ¯ç¨JSãåä¸é¡¹ç®åºæ¬é½ç¨C#,å 为C#åC/C++交äºæ¹ä¾¿ï¼ä¸°å¯çæ°æ®ç»æåé¢å对象çæ¶æå©äºå¤§åç¨åºçç¼å,å¾å¤å¼ºå¤§ç第ä¸æ¹æ件æ¯ç¨C#å¼åçï¼æ¹ä¾¿å·¥ä½æµç¨ã
ç¼è¯è¿ç¨ï¼
UnityScriptè¿è¡ç¯å¢ä½¿ç¨Mono ç.NET Frameworkãå®é ä¸ï¼UnityScriptæ¯ç¨Booå®ç°çï¼Booæ¯è¿è¡å¨Monoèææºä¸çä¸ç§è¯è¨ï¼å¹¶ä¸ç¼è¯ææ¬æºä»£ç ãJavasScriptå¾å¤å ¸åçè¿è¡ç¯å¢å¦StringåMathåºç±Monoæä¾ãä½ ä¹å°±ç¥éäºä¸ºä»ä¹UnityScriptä¸æ¹æ³åè¦å¤§åäºï¼å 为è¦ä¸Monoä¸ç¸åã
Unityä¸çèæ¬åä¼ ç»ç解éå(JIT解é)è¯è¨ä¸åï¼é½æ¯éè¦ç»è¿ç¼è¯çï¼å æ¤é度é½ä¸æ ·å¿«ã
è¿ä¸ç§è¯è¨ç代ç æåé½ä¼è¢«ç¼è¯æ§è¡ï¼èä¸èæ¬å¯ä»¥äºç¸è®¿é®ã
åºçè°ç¨ï¼
Unityçèæ¬åºäºMonoç.netå¹³å°ä¸è¿è¡ï¼èæ¬é½å¯ä»¥ä½¿ç¨.netåºï¼ä¸ºxml,æ°æ®åºï¼æ£å表达å¼æä¾äºè¯å¥½ç解å³æ¹æ¡ã
Unityä¸jsæ³è°ç¨monoç.netåºï¼ç´æ¥importå³å¯ã
import System;
import System.IO;
å¦åï¼ä½ 带æå®å®æ´çå½å空é´æ¥è°ç¨å½æ°ï¼å¦System.IO.File.Open()ï¼èä¸æ¯File.Open()ã
1.åºæ¬ç±»ååè¯å¥ï¼
1)æ°æ®ç±»åï¼
æ°å¼ç±»åï¼char,byte,sbyte;short, ushort, int, uint, long, ulong; float,double; decimal.
å¸å°å¼ï¼boolean
å符串ï¼Stringï¼[index]符å·
å符串[0]æ¯å符串åä¸æ 为0çå符ã
var s: String = "Whatever_it_may_be";
s =s.Replace("_"[0], " "[0]); // replace all the underscoreswith spaces
2)åé声æï¼
åéå¿ é¡»å 声æ[å¿ é¡»](ç¼è¯ç¼æ ï¼ä¸å£°æç±»åæå©äºåå°å¤ªå¤å¸¸éï¼é¿å å åæ³é²åç)ï¼å¯ä»¥å®ä¹ç±»å[å¯é]ï¼
var playerName:String;
å½æ°çåæ°ä¹è¦å£°æç±»åï¼
function Test( playerName:String, baseInfo:Object )
{
}
å¦æ声ææ¶åå®ä¹æèµå¼äºç±»åï¼é£ä¹ä¸è½åæ¹åç±»åï¼é¤é声ææ¶åä¸å®ä¹ç±»åã
var a= "test";
a =5;// æ¥é
var a;
a ="test";
a =5;//æ£ç¡®
åéåé¢å¯ä»¥å public,protected, privateæ¥ä¿®é¥°ï¼ä¸åé»è®¤æ¯publicçï¼publicçåéå¯ä»¥å¨Inspectorè§å¾ä¸æ¥çåç¼è¾ã
3)æ°ç»ï¼
å 建èªå®ä¹æ°ç»(å¿«åè½ç®åï¼ï¼
var values : int[] = { 1,2,3};
转æ¢å°Arrayæ°ç»(éè¦å¯¹æ°ç»å¤çï¼ï¼var arr = new Array(values);
Array对象æ°ç»ï¼æ ¢å¨æå¢é¿æåºå并åè½ï¼ï¼
var arr = new Array(); arr.Push("good");
转æ¢å°å 建æ°ç»ï¼éè¦æ¯è¾é«çæ§è½æ¶å)ï¼var bArray : int[] = arr.ToBuiltin(int);
4)é¾è¡¨åæ³åï¼
UnityScriptå¯ä»¥ä½¿ç¨æ³åï¼æ以å½ç¨å°å¨æ大å°çæ°ç»æ¶ï¼æ好ç¨Listæ¥æ¿ä»£Arrayãåºæ¬ä¸å°±æ²¡æä»ä¹çç±è¦ç¨å°Arrayäºï¼Listæ´å¿«å¹¶ä¸åè½æ´å¤ãå¦æä½ éè¦æ··åç±»åçæ°ç»ï¼ä½ å¯ä»¥ç¨Object ListãUnityScriptä¸æ³åçè¯æ³ä¸C#ä¸æ¥è¿ï¼é¤äºè¦å ä¸ä¸ªé¢å¤çâ.â符å·å¨â<>âä¹åãå¦C#ä¸ç"varmyList = new List<int>();"å¨UnityScriptä¸å¯¹åºçåæ³ä¸ºï¼"var myList = new List.<int>();"ã
5)è¿ç®ç¬¦å表达å¼:
åCä¸æ ·ã
6)è¯å¥ï¼
æ¯è¡å¿ é¡»ååå·; æ¯Cå¤äºfor in ç¨äºéå对象å ç´ ï¼for(var i:int = 0; i < ; i++)ã
switchå¯ä»¥ä½¿ç¨Stringåéã
2.å½æ°
声æè§åï¼
functionå½æ°å(åæ°1:åæ°ç±»å, åæ°2:åæ°ç±»å...):è¿åå¼ç±»å
{
}
unityScriptä¸çå½æ°å¯ä»¥è§ä¸ºFunctionç±»å对象ï¼å¯ä»¥ååéä¸æ ·è¿è¡èµå¼æ¯è¾çæä½ã
ä¸è½åå¿åå½æ°ã
Mathéè¦ç¨Mathfã
3.ç±»(DOM jsä¸æ²¡æç±»)ï¼
å¨Unityéï¼ä¸ä¸ªjsæ件就æ¯ä¸ä¸ªç±»ï¼unityå¼æä¼ä¸ºjsæ件èªå¨çæä¸ä¸ªç±»ã
对äºUnityScriptèæ¬ï¼Unityç¼è¯è¯¥æ件æ¶ä¼èªå¨ç为èæ¬æ·»å ä¸ä¸ªä¸èæ¬æ件åç¸åçç±»ï¼å¹¶èªå¨å°ç»§æ¿äºMonoBehaviourãä½å¯¹äºC#æBoo,åéè¦å¨èæ¬ä¸æ¾å¼çååºç±»åå继æ¿å ³ç³»ãè¦å建ä¸ç»§æ¿èªMonoBehaviourçç±»ï¼ç¨C#è¯è¨ï¼æè ä»å¤é¨æ·»å jsèæ¬èµæº(å°±å¯ä»¥èªå·±ç´æ¥new对象åºæ¥äº)ã
//SayHello.js
#pragma strict // ä¸¥æ ¼ç±»åæ£æµ,å°½æ©çæé误,ç¦ç¨å¨æç±»å,强å¶ç¨éæç±»å(强类å)
function sayHello()
{
}
çä»·äºC#ä¸ï¼
#pragma strict
public class SayHello extends MonoBehaviour
{
function sayHello()
{
}
}
ä½æ¯ï¼ä½ å¯ä»¥å¨åä¸ä¸ªæ件ä¸å£°æå¤ä¸ªç±»ï¼å°¤å ¶æ¯å½ä½ éè¦ä½¿ç¨ä¸äºè¾ å©å·¥å ·ç±»æ¶é常æç¨ï¼ä¸è¬è¿ç§è¾ å©ç±»æ²¡æ继æ¿èªMonoBehaviourã
å¦
class ButtonState {
var currentState : int;
var offset : Vector2;
}
å¦æä½ å¨ä¸ä¸ªæ件ä¸å£°æäºMonoBehaviourçåç±»ï¼ä½ç±»åä¸æ件åä¸å¹é çè¯ï¼å³ä½¿æ¯å¤§å°åä¸ä¸è´ï¼ä½ ä¹ä¼ç¢°å°éº»ç¦ã
ä¸å®è¦ç解ï¼å½ä½ å¨jsæ件ä¸ç¼åè¡ä¸ºèæ¬æ¯ï¼ä½ å®é ä¸å¨ç¼åä¸ä¸ªç±»ï¼
a) ç±»åå ¶å¯¹è±¡ï¼æ件åå°±æ¯ç±»åï¼å¦ææ件åæ¯foo.jsï¼ä½ å°±å¯ä»¥å¨å ¶ä»å°æ¹ä»¥var x = new foo()çæ ¼å¼è¿è¡è°ç¨ï¼
b)ç±»çæ¹æ³åé¢å®ä¹æ¹æ³ï¼æä¸äºç¹å®çæ¹æ³æ¯å®ç°ç³»ç»é¢å å®ä¹çä¸äºäºä»¶å¤çå¨ï¼å¦StartãFixedUpdateçãä»»ä½äºä»¶ä¸ï¼å£°æçä¸ä¸ªå½æ°å°±æ¯è¿ä¸ªæ件æ代表çç±»çä¸ä¸ªæ¹æ³ã
c) ç±»çå±æ§ï¼æ件ä¸å¨å½æ°å®ä¹ä¹å¤ç¼åç代ç é½å¨è¯¥ç±»çèå´ä¹å æ§è¡ï¼å£°æçåéä¹æ¯è¯¥ç±»çæååéãç±»ä¸çéæå½æ°ãåéæ¬è´¨ä¸æ¯ç±»çæ¹æ³ä¸å±æ§ã
å®ä¾ï¼
/*whenyou drag the behavior onto a gameobject, these values will be visible andeditable
*/
public name : String;
/*otherscripts which have a reference to this object (e.g. if they're attached to thesame object) can see public functions
*/
publicage : int;
/*privatemembers are NOT visible to other scripts, even if they have a reference to thisobject
*/
private favoriteColor : Color;
/*youcan assign a value to bestFriend by dragging a gameObject with an attached copyof the foo behavior to this property. This will give you access to bestFriend'spublic methods and members
*/
public bestFriend : foo;
/*this function will be called every frame by Unity, so it's actually an eventhandler
*/
function Update(){
/*transform is a property inherited from thegameObject the behavior is attached to*/
var t = transform;
}
function Bar(){
// this is just a function, if you don't callit yourself, it will never do anything
}
4.继æ¿
Unityééè¦extendså ³é®åï¼
class MyHello extends Hello
{
}
DOM jsä¸ç¨prototypeéçbind()æ¹æ³ã
Unityjséé¢è¿æä¾äºèæå½æ°ã
ç±»ç继æ¿ä¹æ¯ä¸åçãå¨JavaScriptåC#ä¸ï¼æ¹æ³æ¯éå并ä¸ä¸å¯éè½½ï¼é¤éæ¹æ³å£°æä¸æ·»å èæå ³é®åãä¸åçæ¯C#åªéè½½é£äºå å«éè½½å ³é®åoverrideçæ¹æ³ãèJavaScriptä¸éè¦å ³é®è¯ï¼åªè¦é载类æ¹æ³å°±å¯ä»¥è¦çï¼å ¶å®çé½å¯ç»§æ¿å¾å°ã
//Foo.js
var foo = "hello, world";
function doEet () {
// does nothing, intended to be overridden
}
å°ä¼çæï¼
//Foo.js
import UnityEngine;
classFoo extends MonoBehaviour {
public var foo = "hello, world";
public function doEet () {
// does nothing, intended to be overridden
}
}
åç±»åæ³ï¼
//PrintingFoo.js
class PrintingFoo extends Foo {
function doEet() {
print( foo );
}
}
å建èå½æ°ï¼
classFoo
{
virtual function DoSomething ()
{
Debug.Log("from baseclass");
}
}
//SubFoo.js
class SubFoo extends Foo
{
virtual function DoSomething()
{
Debug.Log("from subclass");
}
}
//Elsewhere
varfoo : Foo = new SubFoo();
foo.DoSomething();//printsfrom sub class
å¦æä½ è¦è°ç¨ç¶ç±»çæ¹æ³ï¼ç¨å ³é®åsuperã示ä¾å¦ä¸ï¼
class SubFoo extends Foo
{
virtual function DoSomething()
{
super.DoSomething();// ä¸æ¯èå½æ°ï¼åºè¯¥ä¸éè¦super修饰就å¯ä»¥ç´æ¥è°ç¨ã
Debug.Log("from sub class");
}
}
//Elsewhere
varfoo : Foo = new SubFoo();
foo.DoSomething();//prints"from base class" and "from sub class"
ç±»é´éä¿¡ï¼Use-aæ¹å¼ï¼å ³èå ³ç³»ï¼æ¯ç»§æ¿è¦å度åºå¾å¤ï¼æäºä¿®æ¹ç»´æ¤
/*Foo.js */
varbar : Bar;
function Start(){
bar = gameObject.GetComponent(Bar);
}
function doEet(){
// do my own thing
if( bar ){
bar.doEet();
}
}
/*Bar.js */
function doEet(){
// do something special
}
5.对象
Unityä¸ä¸ä¸å®å¯ä»¥ç¨new å建对象(æ®éç±»å¯ä»¥ï¼ç¹æ®ç±»ä¸è¡ï¼åç§èæ¬é½ä¸æ ·)ãç¹æ®ç±»ï¼ç¨ç¼è¾å¨å·¥ç¨è§å¾å³é®æè ç»ä»¶Create js æè C#çç±»é½æ¯ç»§æ¿èªMonoBehaviourç±»ï¼å¯¹è¿ç§ç±»åçç±»ä¸è½newåºæ¥ä¸ä¸ªå¯¹è±¡ï¼åå æ¯Unityä¼ä¸ºè¿ç§ç±»èªå¨å建对象ï¼å¹¶è°ç¨è¢«éè½½çæ¹æ³ã
使å¾ç¨Unityé常æ趣çä¸ä»¶äºæ¯ï¼å®çç±»éç¨äºé常èªç±çmixinçç¥ãéå¸¸ä½ å¯ä»¥é常快éç®åçæ¥å°ä½ æéè¦çç±»ãæéç¨çä¸ä¸ªä¾åæ¯Transformç±»ï¼å¯¹äºä½ æ£å¨å¤ççä¸ä¸ªå¯¹è±¡ï¼ææ被éå å°è¯¥å¯¹è±¡çç¸å ³èçç±»ï¼é½å¯ä»¥ç®åå¿«éçè·åå®çå±æ§åæ¹æ³ã
æ¯å¦ï¼å ¸åçå¨ä½å°±æ¯ä½ ä¼è®¿é®åå«"transform"çåéï¼å®ä»£è¡¨ä¸è¯¥å¯¹è±¡å ³èçTransformç±»çå®ä¾ãå¦æä½ éè¦ç¸å ³çä½ç½®åæ ï¼å°±è®¿é®transform.position(ä¸ä¸ª Vector3对象);å¦æä½ éè¦å®çGameObjectï¼å°±è®¿é®transform.gameObjectï¼å¦æä½ éè¦å®ç渲æå¨ï¼å°±è®¿é®transform.rendererãççãä¸è¬å¦æä½ ä¸ä¸ªå¯¹è±¡ç主è¦å±æ§ï¼ä½ å°±å¯ä»¥å¿«éè·å该对象ææå ¶ä»çå±æ§ã
6.jsåC#ååéä¿¡ï¼ä¸è½ååéä¿¡ï¼å 为ç¼è¯é®é¢
js访é®C#èæ¬ç»ä»¶ï¼
//createa variable to access the C# script
private var csScript : CSharp1;
function Awake()
{
//Get the CSharp Script
csScript =this.GetComponent("CSharp1");//Don't forget to place the 'CSharp1'file inside the 'Standard Assets' folder
}
//rendertext and other GUI elements to the screen
function OnGUI()
{
//render the CSharp1 'message' variable
GUI.Label(new Rect(,,,),csScript.message);
}
C#访é®jsèæ¬ç»ä»¶ï¼
using UnityEngine;
using System.Collections;
public class CSharp2 : MonoBehaviour
{
//create a variable to access the JavaScriptscript
private JS1 jsScript;
void Awake()
{
//Get the JavaScript component
jsScript = this.GetComponent<JS1>();//Don'tforget to place the 'JS1' file inside the 'Standard Assets' folder
}
//render text and other GUI elements to thescreen
void OnGUI()
{
//render the JS1 'message' variable
GUI.Label(newRect(,,,),jsScript.message);
}
}
7.使ç¨ç¬¬ä¸æ¹åºï¼
第ä¸æ¹.NETåºå¦XML-RPCå¯ä»¥ä»¥æ°å»ºèµæºAssetçæ¹å¼å¼å ¥ã
8.è°è¯
å¯ä»¥ç¨printå½æ°ï¼Log()å½æ°æè Debug.Log(),æ³è®¾ç½®æç¹ï¼ç¨Debug.Break()å½æ°ã
print() å½æ°å°ä¼çææ¶æ¯ï¼å¹¶è¾åºå°ç¶ææ åæ§å¶å°ä¸ï¼ä½ä» éMonoBehavioourç±»èå´å ã
æ´å¥½çåæ³æ¯ä½¿ç¨Debug.Log("insert messagehere");ï¼è¯¥æ¹æ³å°å¤é½å¯ä½¿ç¨ãè¿å¯ç¨Debug.LogWarning å Debug.LogErrorçæè¦ååé误æ¶æ¯ã
Debug.Break(); å¯ä»¥å°æ¸¸ææåå¨ä¸ä¸ªç²¾ç¡®çç¹ãå½ä¸ç§ç¹å®çæ æ¡ä»¶åçæ¶ï¼å¦æä½ æ³æ£æ¥å¯¹è±¡çç¶æçæ¶åï¼è¿ä¸ªç¹æ§é常æç¨ã
å¼åç¯å¢è¿è¡é¡¹ç®æ¶ï¼ç¼è¾çé¢ä¹æ¯å®å ¨å®æ¶æ´æ°çï¼ä½ å¯ä»¥æ¥ç对象å®ä¾çå é¨ç¶æã
Unity 按一次键,为什么OnGUI中的部分函数会多次响应?
int i=1; void update() { if(i>=1) { i=0 if(......) { ....... } } i+=Time.deltatime } 这个是一秒执行一次内部的if判断如果你想每帧都进行内部的判断,并为真时才间隔一秒的话可以把i=0放进内部的if