unity3d腳本教程
㈠ 如何自學unity3d
你可以先去【繪學霸】網站找「游戲特效/unity3D」板塊的【免費】視頻教程-【點擊進入】完整入門到精通視頻教程列表: www.huixueba.net/web/AppWebClient/AllCourseAndResourcePage?type=1&tagid=306&zdhhr-11y04r-1610725651392770307
想要系統的學習可以考慮報一個網路直播課,推薦CGWANG的網路課。老師講得細,上完還可以回看,還有同類型錄播課可以免費學(贈送終身VIP)。
自製能力相對較弱的話,建議還是去好點的培訓機構,實力和規模在國內排名前幾的大機構,推薦行業龍頭:王氏教育。
王氏教育全國直營校區面授課程試聽【復制後面鏈接在瀏覽器也可打開】:
www.cgwang.com/course/gecoursemobilecheck/?zdhhr-11y04r-1610725651392770307
在「游戲特效/unity3D」領域的培訓機構里,【王氏教育】是國內的老大,且沒有加盟分校,都是總部直營的連鎖校區。跟很多其它同類型大機構不一樣的是:王氏教育每個校區都是實體面授,老師是手把手教,而且有專門的班主任從早盯到晚,爆肝式的學習模式,提升會很快,特別適合基礎差的學生。
大家可以先把【繪學霸】APP下載到自己手機,方便碎片時間學習——繪學霸APP下載: www.huixueba.com.cn/Scripts/download.html
㈡ 如何用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 < 10; 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 of 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(10,30,500,20),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(10,10,300,20),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(); 可以將游戲暫停在一個精確的點。當一種特定的情條件發生時,如果你想檢查對象的狀態的時候,這個特性非常有用。
開發環境運行項目時,編輯界面也是完全實時更新的,你可以查看對象實例的內部狀態。
㈢ unity3d碰撞腳本
修改物體的mesh用GetComponent<MeshFilter>().mesh=mesh,比如Cube修改為Sphere:
GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Cube);//先建立一個Cube
GetComponent<MeshFilter>().mesh = sphere.GetComponent<MeshFilter>().mesh;//把Cube的mesh復制給Sphere
㈣ unity3d怎麼用腳本激活腳本
C#是一種非常典雅而強大的編程語言,它的dot-syntax命名法則基於Java,所以如果你具有Java編程背景將感到非常舒服。不過區別也還是有一些的,最明顯的應該是在C#中屬性以及方法的名稱約定俗稱都是以大寫字母開頭的。 C#的特性列表實在太長,這使得ActionScript實在是看起來有些相形見絀。 C#與Actionscript從本質上是極為相似的。
運算符重載
它允許程序員為+-*/這樣的運算符定義特殊的行為。它的優勢在向量加法運算中就可以明顯體現出來,在ActionScript中,要計算向量之和,你需要書寫類似下面的代碼:
view sourceprint?1.var c:Vector3D = a.add(b);
復制代碼
在多於兩個向量相加時代碼的易讀性會變得很差。如果在C#中重載+運算符,代碼將會變成下面的形式:
view sourceprint?1.Vector3 c = a + b;
復制代碼
在Unity3D中所有向量的運算符都進行了重載。如果你希望自己實現,運算符重載也非常簡單,對於上面的例子,代碼大致是下面這個樣子的:
view sourceprint?1.public static Vector3 operator + (a:Vector3, b:Vector3) {
return new Vector3(a.x + b.x, a.y + b.y, a.z + b.z);
}
復制代碼
這其中有一些簡單的規則:運算符函數永遠都是靜態的(static),並且需要返回它所定義的對象類型。不過它的參數可以是任何類型的,因此完全可以重載加法或乘法運算符使其支持向量與浮點數或者與矩陣的運算——而這一切都要得益於C#對運算符重載功能的支持。
方法重載
方法重載可以允許我們定義多個同名但參數不同的方法。它不但對一般方法起作用而且也可以應用於構造函數——如果有多種途徑來初始化一個對象,那麼你可以為每一種途徑定義一個專有的構造函數。而且方法重載同樣可以應用於運算符方法,這一點上面已經提到了。
在Unity3D API中一個關於運算符重載最好的例子就是』Transform.Rotate()』這個方法,它被重載了三次以滿足不同的旋轉參數:
view sourceprint?1.void Rotate (Vector3 eulerAngles, Space relativeTo)
void Rotate (float xAngle, float yAngle, float zAngle, Space relativeTo)
void Rotate (Vector3 axis, float angle, Space relativeTo)
復制代碼
你可以指定歐拉角,也可以指定旋轉軸以及旋轉角度。ActionScript可以使用默認參數來模擬方法重載,但是這樣做並不方便也不便於理解。
Getter/Setter語法
C#聲明參數的方法非常簡明扼要,在ActionScript中需要兩個方法——一個』get』一個』set』,而在C#中的代碼則是這樣的:
view sourceprint?1.public float Size { get; set; }
復制代碼
在這種情況下,你不需要額外做任何工作編譯器就會自動創建一個私有屬性,當然,這樣的定義沒什麼用處,下面列舉一個稍微復雜點的,包括一個public的get以及private的set:
view sourceprint?1.public float Area {
get { return size * size; };
private set { size = Mathf.Sqrt(value) };
}
復制代碼
想必你應該已經注意到了,盡管C#源自Java,在C#中卻並不使用』function』和』var『關鍵詞——這樣做之所以好是因為這兩個關鍵詞完全是冗餘的病情不會為代碼增加任何有價值的信息。對於其他特性,我推薦看看indexers,generic types,structures以及enumerators,在上面提到的C# Pocket Book中都有詳細介紹,許多C#教程中也有涉及。
編輯C#
很多編輯器都支持C#,微軟提供的Visual C# Express Edition免費而且非常好用,支持代碼自動補完功能,但是只對應Windows平台(顯然的)。對於Max平台Mono Develop看起很強大但是還並不是很穩定。 不幸的是Eclipse的C# plugin目前為止非常不穩定,所以我並不推薦,但好在它目前還處於Alpha階段。當然,不論如何,我們最後至少還可以求助於TextMate。
最後需要提到的是Unitron——Unity3D自帶的默認編輯器。在開發者中間它並不怎麼流行,而且我看到有人抱怨他過於基本了,我並不認同這種觀點。雖然它不如FDT之於ActionScript那樣強大,但是它非常穩定而且具備基本的代碼自動補完功能,自動補完功能在默認設置下是關閉的,要開啟該功能需要打開』Preferences』,你會在』General』面板的底端找到這個選項,如此一來我相信Unitron還是值得一用的。
我們中很多人都是在瀏覽器環境下認識Javascript的,而Javascript也是很多人平生第一次使用的編程語言。如果是這種情況的話,你很可能會立刻開始使用Javascript進行Unity3D的編程而不必操心要學習什麼新東西,畢竟,如Unity3D所說,任何使用C#可以完成的事同樣可以使用Javascript完成。
但是從長遠考慮的話,C#可以提供更好的代碼管理,完整的OOP支持,strong typing以及掌握一門優秀編程語言所帶來的成就感。
㈤ 求關於unity3d c#腳本的一套完整的教程
unity3d 4.x手機游戲開發。很詳細的幾個小案例
㈥ unity3d控制任務移動的簡單腳本
你可以到paws3d上看看他們的腳本是怎麼編寫的,又簡潔又規范
㈦ Unity3D中用JavaScript寫腳本,如何引用其他JS腳本,調用其他腳本內的方法,
1、方法定義為static,直接類名.方法名調用;
如
class Main1{
public static function Add(j:int,i:int):void
{
Debug.Log(i+j);
}
}
Main1.Add(1,2);
2、new 一個對象,對象調用,如
var m:Main1 = new Main1();
m.Add(2,3);
3、GameObject.Find(),得到那個有這個腳本組件的GameObject,這個GameObject再GetComponent,得到script,scirpt再調用方法。