http://dong2008hong.blog.163.com/blog/static/469688272014032134394/
WWWFrom 类
Unity3D脚本中文系列教程(十三)
辅助类。用来生成表单数据并使用WWW类传递到web服务器。
// 获取一个截屏并上传到CGI脚本
// 该CGI脚本必须能处理表单上传
var screenshotURL = “http://www.my-site.com/cgi-bin/screenshot.pl”;
// 截屏
function Start()
{
UploadPNG();
}
function UploadPNG ()
{
yield WaitForEndOfFrame(); // 我们应该只在所有渲染完成后读取屏幕
var width = Screen.width;
var height = Screen.height;
var tex = new Texture2D(width, height, TextureFormatRGB24, false); // 创建屏幕大小的纹理,RGB24格式
//读取屏幕内存到纹理
tex.ReadPixels(Rect(0, 0, width, height), 0, 0);
tex.Apply();
// 编码纹理为PNG
var bytes = tex.EncodeToPNG();
Destroy(tex);
// 创建一个Web表单
var form = new WWWForm();
form.AddField(“frameCount”, Time.frameCount.ToString());
form.AddBinaryData(“fileUpload”, bytes, “screenshot.png”, “image.png”);
// 上传到一个CGI脚本
var w = WWW(screenShotURL, form);
yield w;
if(w.error != null)
{
print(w.error);
}
else
{
print(“Finished Uploading Screenshot”);
}
}
这里是一个简单的Perl脚本用处理存贮在SQL数据库中的高分表
// 这个例子假设玩家已经输入了他的名称到一个name变量中并且score包含玩家的当前分数
var highscore_url = “http://www.my-site.com/highscore.pl”;
function Start()
{
// 创建一个表单来发送高分数据到服务器
var form = new WWWForm();
// 假设perl脚本为不同的游戏管理高分
form.AddField(“game”, “MyGameName”);
// 玩家提交的名称
form.AddField(“playerName”, name);
// 分数
form.AddField(“score”, score);
//创建一个下载对象
var download = new WWW(highscore_url, form);
//等待直到下载完成
yield download;
if(download.error)
{
print(“Error downloading “ + download.error);
}
else
{
// 显示高分
}
}
这里是一个单间的Perl脚本用来处理存贮在SQL数据库中的高分表
#/usr/bin/perl
#SQL数据库需要有一个称为highscores的表
# 看起来像这样
#CREATE TABLE highscores (
#game varchar(255) NOT NULL,
#player varchar(255) NOT NULL,
#score integer NOT NULL
# );
use strict;
use CGI;
use DB1;
# 读取表单数据
my $cgi = new CGI;
# 来自高分脚本的结果将是in纯文本格式
print $cgi -> header(“text/plain”);
my $game = $cgi -> param(‘game’);
my $playeName = $cgi -> param(‘playerName’);
my $score = $cgi -> param(‘score’);
exit 0 unless $game; #这个参数被请求链接到一个数据库
my $dbh = DB1 -> connect(‘DB1.mysql.databasename’, ‘username’, ‘password’) || die “Could not connect to database: $DB1::errstr”;
# 如果插入玩家分数if
if($playerName && $score) {
$dbh -> do(“insert into highscores(game, player, score) values(?,?,?)”, undef, $game, $playerName, $score);
}
# 取回高分
my $sth = $dbh -> prepare(“SELECT player, score FROM highscores WHERE game=? ORDER BY score desc LIMIT 10”);
#dbh -> execute($game);
while(my $r = $sth -> fetchrow_arrayref) {
print join(‘.’, @$r), “
”
}
变量
◆ var data : byte[]
描述: (只读)在发送表单的时候原始数据作为POST请求被发送。
通常,你只需要直接将WWWForm对象传递给WWW构造函数,但是如果你像改变发送到web服务器的头,你将需要这个变量。
参见: headers变量
var form = new WWWForm();
form.AddField(“name”, “value”);
var headers = form.headers;
var rawData = form.data;
// 给请求添加一个自定义的头,在这里用一个简单的授权来访问密码保护的资源
header[“Authorization”]=”Basic”+System.Convert.ToBase64StringSystem.Text.Encoding.ASCII.GetBytes(“username:password));
// 用自定义的头传递一个请求到URL
var www= new WWW(url, rawData, headers);
yield www;
// 这里处理WWW请求结果…
◆ var headers : Hashtable
描述: (只读)为使用WWW类传递的表单返回一个正确的请求头。
这个域只包含一个头,/”Content-Type”/,它被设置为正确的mine类型。”application/x-www-form-urlencoded”用于普通的表单,”multipart/form-data”用于使用AddBinaryData添加数据的表单。
var form = new WWWForm();
form.AddField(“name”, “value”);
var headers = form.headers;
var rawData = form.data;
// 给请求添加一个自定义的头,在这里用一个简单的授权来访问密码保护的资源 header[“Authorization”]=”Basic”+System.Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(“username:password));
// 用自定义的头传递一个请求到URL
var www= new WWW(url, rawData, headers);
yield www;
// 这里处理WWW请求结果…
构造函数
◆ static function WWWForm() : WWWForm
描述: 创建一个空的WWWForm对象。
使用AddField和AddBinaryData方法向表单中插入数据。
参见: WWW类
函数
◆ function AddBinaryData(fieldname : string, contents : byte[], filename : string = null,mimeType : string = null) : void
描述: 添加二进制数据到表单。
使用这个函数来上传文件和图片到web服务器,注意数据从字节数组中读取而不是从一个文件中读取。fileName参数用来告诉服务器用什么文件名来保存上传的文件。
如果mimeType没有给出,并且数据的前8字节与PNG格式头相同,然后数据用”image/png”mimetype发送,否则它将用”application/octet-stream”mimetype发送。
◆ function AddField(filename : string, value : string, e : Encoding = System.Text.Encoding.UTF8) : void
描述: 添加一个简单的域到表单。
用给的字符串值添加域fileName。
◆ function AddField(filedName : string, i : int) : void
描述: 添加一个简单的域到表单。
用给定的X形值添加域filedName。一个简单的方法是调用AddField(fieldname, i.ToString)。
WWW 类,集成自IDisposable
简单地访问web页。
这个是一个小的工具模块可以用来取回URL的内容。
通过调用WWW(url)在后台开始一个下载,它将返回一个WWW物体。
你可以检查isDone属性来查看下载是否完成,或者yield下载物体来自动等待,直到它被下载完成(不会影响游戏的其余部分)。
如果你像从web服务器上获取一些数据例如高分列表或者调用主页,可以使用这个,也有一些功能可以使用从web上下载的图片来创建一个纹理,或者下载或加载新的web播放器数据文件。
WWW类可以用来发送GET和POST请求到服务器,WWW类默认使用GET,如果提供一个postData参数就使用POST。
参见: WWWForm为postData参数构建可用的表单数据。
// 从时代广场上的外部”Friday’s” web摄像头获取最新的数据
var url = “http://images.earthcam.com/ec_metros/ourcams/fridays.jpg”;
function Start()
{
// 开始下载给定的URL
var www : WWW = new WWW(url);
// 等待下载完成
yield www;
//赋值纹理
renderer.material.mainTexture = www.texture;
}
变量
◆ var assetBundle : AssetBundle
描述: 从工程文件中下载一个可以包含任意类型资源的AssetBundle。
function Start()
{
var www = new WWW(“http://myserver/myBundle.unity3d”);
yield www;
// 获取制定的主资源并实例化它
Instantiate(www.assetBundle.mainAsset);
}
参见: AssetBundle类。
◆ var audioClip : AudioClip
描述: 从下载的数据生成一个AudioClip(只读)。
该数据必须是一个Ogg Vorbis格式的音频剪辑。
即使音频没有完全下载完成,这个也立即返回,允许你开始播放已经下载完成的部分。
var url : String;
function Start()
{
www = new WWW(url);
audio.clip = www.audioClip;
}
function Update()
{
if(!audio.isPlaying && audio.clip.isReadyToPlay)
{
audio.Play();
}
}
◆ var bytes : byte[]
描述: 将取回的web页内容作为一个字节数组返回(只读)。
如果物体还没有完成数据的下载,它将返回一个空字节数组。使用isDone或者yield来查看数据是否可用。
参见: data属性
◆ var data : string
描述: 将取回的web页内容作为一个字符串返回(只读)。
如果物体还没有完成数据的下载,它将返回一个空字符串。使用isDone或者yield来查看数据是否可用。
这个函数期望网页内容是UTF-8或者ASCII字符集。对于其他字符或者二进制数据返回的字符串也许是不正确的。在这些情况下,使用bytes属性来获取原始字节数组。
参见: bytes属性
◆ var error : string
描述: 如果下载的时候出现了一个错误,返回错误信息(只读)。
如果没有错误,error将返回null。
如果物体没有下载完成,它将被阻止直到下载完成。使用isDone或yield来查看数据是否可用。
// 用一个无效的URL获取一个纹理
var url = “invalid_url”;
function Start()
{
// 开始下载给定的URL
var www : WWW = new WWW(url);
// 等待下载完成
yield www;
// 打印错误的控制台
if(www.error!=null)
{
Debug.Log(www.error);
}
//赋值纹理
renderer.material.mainTexture = www.texture;
}
◆ var isDone : bool
描述: 下载是否完成(只读)。
如果你试图访问任何isDone为false的数据,程序将被阻止知道下载完成。
? var movie : MovieTexture
描述: 从下载的数据生成一个MovieTexture(只读)。
数据必须为一个Ogg Theora格式视频。
即使视频完全没有下载完成,这个也立即返回,允许你开始播放已经下载完成的部分。
var url = “http://www.unity3d.com/webplayers/Movie/sample.ogg”;
function Start()
{
// 开始下载
var www = WWW(url);
// 确保视频在开始播放前已经准备好
var movieTexture = www.movie;
while(!movieTexture.isReadyToPlay)
yield;
//初始化GUI纹理为1:1解析度并居中
guiTexture.texture = movieTexture;
transform.localScale = Vector3(0,0,0);
transform.position = Vector3(0.5, 0.5, 0);
guiTexture.pixelInset.xMin = -movieTexture.width/2;
guiTexture.pixelInset.xMax = movieTexture. width /2;
guiTexture.pixelInset.yMin = -movieTexture.height/2;
guiTexture.pixelInset.yMax = movieTexture. height /2;
// 赋值剪辑到音频源
// 与音频同步播放
audio.clip = movieTexture.audioClip;
// 播放视频和音频
movieTexture.Play();
audio.Play();
}
// 确保我们有GUI纹理和音频源
@script RequireComponent(GUITexture)
@script RequireComponent(AudioSource)
◆ var oggVorbis : AudioClip
描述: 加载Ogg Vorbis文件到音频剪辑。
如果流没有被完全下载,将返回null。使用isDone或者yield来查看数据是否可用。
参见: AudioClip, AudioSource
var path = “http://ua301106.us.archive.org/2/items/abird2005-02-10t02.ogg”;
function Start()
{
var download = new WWW(path); // 开始下载
yield download; // 等待下载完成
var clip : AudioClip = download.oggVorbis; // 创建ogg vorbis文件
// 播放它
if(clip!=null)
{
audio.clip = clip;
audio.Play();
// 处理错误
}
else
{
Debug.Log(“Ogg vorbis download failed(Incorrect link?)”);
}
}
@script RequireComponent(AudioSource)
// 一个通用的流式音乐播放器
// 成功地下载音乐,然后随机地播放它们
var downloadPath : String[] = [“http:/ia301106.us.archive.org/2/items/abird2005-02-10t02.ogg”];
private var downloadedClips : AudioClip[];
private var playedSongs = new Array();
function Start ()
{
downloadedClips = new AudioClip(downloadPath.Length);
DownloadAll();
PlaySongs();
}
function DownloadAll()
{
for(var i=0;i<downloadPath.length;i++)
{
var path = downloadPath[i];
var download = new WWW(path);
yield download;
downloadedClips[i] = download.oggVorbis;
if(downloadedClips[i] == null)
Debug.Log(“Failed audio download” + path);
}
}
function PickRandomSong() : AudioClip
{
var possibleSongs = Array();
// 构建一个下载完成的音乐列表
for(var i=0;i<downloadedClips.length;i++)
{
if(downloadedClips[i] != null)
possibleSongs.Add[i];
}
// 还没有音乐被下载
if(possibleSongs.length == 0)
return null;
// 我们播放了所有音乐,现在从任何音乐中选择
if(possibleSongs.length == playedSongs.length)
playerSongs.Clear();
// 从列表中已出已经播放完成的音乐
for(i=0;i<playedSongs.length;i++)
possibleSongs.Remove(playedSongs[i]);
// 获取一个随即的音乐
if(possibleSongs.length != 0)
{
var index : int = possibleSongs[Random.Range(0,possibleSongs.length)];
playedSongs.Add(index);
return downloadedClips[index];
}
else return null;
}
function PlaySongs()
{
while(true)
{
var clip : AudioClip = PickRandomSongs();
if(clip != null)
{
audio.clip = clip;
audio.Play();
yield WaitFormSecond(clip.length);
}
yield;
}
}
@script RequireComponent(AudioSource)
◆ var texture : Texture2D
描述: 从下载的数据生成一个Texture2D(只读)。
数据必须是JPG或者PNG图片格式。如果数据图像不可用,产生的纹理将是一个带问号的纹理。建议使用2的幂次大小的图片;任意大小的也可以工作但是加载的比较慢并会占用较多的内存。每个纹理属性的调用都会分配一个新的Texture2D。如果你连续的下载纹理,必须使用LoadImageInfoTexture或销毁前面创建的纹理。
对于PNG文件,如果包含伽马修正,伽马修正将被应用到该纹理,显示的伽马修正假定为2.0,如果文件没有包含伽马信息,将不会执行任何颜色修正。
如果物体还没有完成数据的下载,它将返回一个虚构的图片,使用isDone或者yield来查看数据是否可以用。
// 从时代广场上的外部”Friday’s” web摄像头获取最新的数据
var url = “http://images.earthcam.com/ec_metros/ourcams/fridays.jpg”;
function Start()
{
// 开始下载给定的URL
var www : WWW = new WWW(url);
// 等待下载完成
yield www;
// 赋值纹理
renderer.material.mainTexture = www. texture;
}
◆ var uploadProgress : float
描述: 上传了多少(只读)。
这是0和1之间的值: 0表示没有发送任何数据,1表示上传完成。
uploadProgress目前没有完全在web播放器中实现,如果在web播放器中使用它将在上传的时候返回0.5,上传完成后返回1.0。
因为所有到服务器的数据发送在接收数据以前完成,所以当progress大于0时,uploadProgress将总是1.0。
◆ var url : string
◆ static function WWW(url : string, postData : byte[], headers : Hashtable) : WWW
参数:
url下载的URL
postData 传递到该url的字节数组数据
headers 一个自定义头部的hash表,随着请求发送
返回: WWW,一个新的WWW物体。当它被下载后,结果可以从返回的物体中间取回。
描述: 用给定的URL创建一个WWW请求
这个函数创建并发送一个POST请求,该请求带有包含在postData中的post数据和header哈希表提供的自定义请求头。流将自动开始下载。如果你需要以自定义的格式传递原始数据到服务器,或者如果你需要提供自定义的请求头。
流创建之后你不得不等待直到它完成,然后你可以访问下载的数据。作为一个快捷的方法,流可以被yield,这样你能够非常容易的告诉Unity等待下载完成。
函数
◆ function Dispose () : void
描述:
◆ function LoadImageIntoTexture(tex : Texture2D) : void
参数:
tex 一个已存在的纹理物体可以被这个图像数据覆盖。
描述: 用来自下载数据的图像替换已存在的Texture2D内容。
数据必须是JPG或PNG图片格式。如果数据图像不可用,产生的纹理将是一个带问号的纹理。建议使用2的幂次大小的图片;任意大小的也可以工作但是加载的比较慢并会占用较多的内存。
对于PNG文件,如果包含伽马修正,伽马修正将被应用到该纹理。显示的伽马修正假定为2.0。如果文件没有包含伽马信息,将不会执行任何颜色修正。
如果数据没有下载完成,纹理将保持不变。使用isDone或yield来查看数据是否可用。
// 获取时代广场最新的外部”Friday’s”web摄像头数据
var url = “http://images.earthcam.com/ec_metros/ourcams/fridays.jpg”;
function Start()
{
renderer.material.mainTexture = new Texture2D(512,512);
while(true)
{
// 开始下载给定的URL
var www = new WWW(url);
// 等待直到下载完成
yield www;
// 赋值下载的图片到物体的主纹理
www.LoadImageIntoTexture(renderer.material.mainTexture);
}
}
◆ function LoadUnityWeb() : void
描述: 加载新的web播放器数据文件。
加载的unity3d文件的第一个关卡将自动被加载,所有来自前一个.unity3d文件的物体、脚本和静态变量将被卸载。你可以使用PlayerPrefab类在两个绘画间移动信息。
这个函数只能在web播放器中使用。
如果物体还没有完全下载,unity3d文件将不会被加载。使用isDone或yield来查看数据是否可用。
function Start()
{
// 开始缓存数据文件
var stream = new WWW(“http://www.unity3d.com/webplayers/Lightning/lightning.unity3d”);
// Yield直到流完成
yield stream;
// 加载它!
stream.LoadUnityWeb();
}
// 下载一个.unity3d文件并在GUI纹理中显示速度,你需要确保GUI纹理被设置为具有一个pixelInset
function Update()
{
// 保存原始的pixelInset并修改它
var originalPixelRect = guiTexture.pixelInset;
// 通过缩放GUI纹理来更新进度栏,直到到达末端
var stream = new WWW(“http://www.unity3d.com/webplayers/Lightning/lightning.unity3d”);
while(!stream.isDone)
{
guiTexture.pixelInset.xMax = originalPixelRect.xMin + stream.progress * originalPixelRect.width;
yield;
}
// 在加载前更新最后一次
guiTexture.pixelInset.xMax = originalPixelRect.xMax;
stream.LoadUnityWeb();
}
类方法
◆ static function EscapeURL(s : string, e : Encoding = System.Text.Encoding.UTF8) : string
参数:
s 用来编码的字符串
e 编码使用的字符集
返回: string。一个新的字符串,所有非法的字符都使用%xx替换,这里xx是十六进制编码。
描述: 编码字符串为URL友好的格式。
用正确的URL编码替换s中的非法字符,在构建web页参数时使用它。
参见: WWW.URL
// 这将打印字符串”Testing 1,2,3”到控制台
print(WWW.EscapeURL(“Testing 1,2,3));
◆ static function URL(s : string, e : Encoding = System.Text.Encoding.UTF8) : string
参数:
s 一个编码过的字符串
e 编码使用的字符集
返回: string – 一个新的字符串,其中所有的%xx都将使用对应的字符来替换。
描述: 从URL友好的格式解码一个字符串。
是WWW.EscapeURL的反响。
参见: WWW.EscapeURL
// 这将打印字符串”Testing 1,2,3”到控制台
print(WWW.URL(“Testing 1,2,3”));
WheelFrictionCurve 结构
WheelFrictionCurve被WheelCollider使用来描述:轮胎的摩擦力属性。
该曲线使用轮胎的滑动作为输入并输出一个力。该曲线近似由两端曲线构成。第一段从(0,0)到(extremumSlip, extremumValue)到(asymptoteSlip, asymptoteValue),这里曲线的切线再次为零。
车轮碰撞器使用不同于物理引擎的一个基于滑动的摩擦力模型来计算摩擦力。它分割整个摩擦力为“向前”组件(在滚动的方向上,并负责加速和制动)和“侧滑”组件(垂直于滚动方向,负责保持车辆的方向)。轮胎的摩擦力在这些方向上分别使用WheelCollider.forwardFrictioni和WheelCollider.sidewaysFriction描述:在两个方向上它首先决定轮胎滑动了多少(橡胶和路面之间速度的不同),然后这个滑动值用来找到在接触点上轮胎受到的力。
真是的轮胎属性是较慢的滑动将获得较高的力因为橡胶通过拉伸补偿滑动,然后当滑动变的较高时,这个力被减小因为轮胎开始滑动或旋转。因此轮胎摩擦力曲线具有上图所示的形状。
因为轮胎的摩擦力是分别计算的,地面的PhysicMaterial不会影响车轮。通过改变车轮所碰到的forwardFriction和sidewayFriction来模拟不同的路面材质。参见:WheelCollider.GetGroudHit, WheelHit。
参见: WheelCollider, WheelCollider.forwardFriction, WheelCollider.sidewayFriction
变量
◆ var asymptoteSlip : float
描述: 滑动渐进线点(默认为2)。
◆ var asymptoteValue : float
描述: 渐进线滑动上的力(默认为10000)。
◆ var extremumSlip : float
描述: 滑动极值点(默认为1)。
◆ var extremumValue : float
描述: 滑动极值的力(默认为20000)。
◆ var stiffness : float
描述: extremumValue和asymptoteValue的倍数(默认为1)。
改变摩擦系数,设置这个为零将完全禁用车轮的所有摩擦。
通常修改stiffness来模拟各种地面材质(例如,玻璃具有较低的摩擦系数)。
参见: WheelCollider.GetGroudHit
// 当附加到WheelCollider时,基于地面的材质的静态摩擦力修改轮胎的摩擦力
function FixedUpdate()
{
var hit : WheelHit;
var wheel : WheelCollider = GetComponent(WheelCollider);
if(wheel.GetGroundHit(hit))
{
wheel.forwardFriction.siffness = hit.collider.material.staticFriction;
wheel.sidewayFriction.siffness = hit.collider.material.staticFriction;
}
}
WheelHit 结构
车轮的接触信息,由WheelCollider得到。
用于WheelCollider的摩擦力是独立于物理系统计算的,使用基于轮胎摩擦力模型的滑动。这允许更加真实的行为,而且使车轮忽略标准的PhysicMaterial设置。
模拟不同地面材质的方法是查询WheelCollider获取它的碰撞信息(参考WheelCollider.GetGroundHit)。通常你可以获取车轮碰到的其他collider,并基于地面material修改车轮的forwardFriction和sidewayFriction。
变量
◆ var collider : Collider
描述: 车轮碰撞到的Collider。
// 当附加到WheelCollider时,基于地面的材质的静态摩擦力修改轮胎的摩擦力
function FixedUpdate()
{
var hit : WheelHit;
var wheel : WheelCollider = GetComponent(WheelCollider);
if(wheel.GetGroundHit(hit))
{
wheel.forwardFriction.siffness = hit.collider.material.staticFriction;
wheel.sidewayFriction.siffness = hit.collider.material.staticFriction;
}
}
◆ var force : float
描述: 应用到接触点的力的大小。
◆ var forwardDir : Vector3
描述: 车轮指向的方向。
◆ var forwardSlip : float
描述: 在滚动方向上的滑动,加速滑动为负,制动滑动为正。
// 当轮胎滑动时打印”Braking Slip!”
function FixedUpdate()
{
var hit : WheelHit;
var wheel : WheelCollider = GetComponent(WheelCollider);
if(wheel.GetGroundHit(hit))
{
if(hit.forwardSlip > 0.5)
print(“braking slip!”);
}
}
◆ var normal : Vector3
描述: 接触点的法线。
◆ var point : Vector3
描述: 轮胎和地面的接触点。
◆ var sidewaysDir : Vector3
描述: 车轮的侧向。
◆ var sidewaysSlip : float
描述: 在侧面方向上的滑动。
YieldInstruction 类
用于所有yield指令的基类。
参考WaitForSeconds,WaitForFixedUpdate,Coroutine和MonoBehaviour.StartCoroutine获取更多信息。
Coroutine 类,继承自YieldInstruction
MonoBehaviour.StartCoroutine返回一个Coroutine。
一个Coroutine是一个函数,这个函数可以被暂停(yield)直到给定的YieldInstruction完成。
// 打印”Starting 0.0”
// 打印”WaitAndPrint 5.0”
// 打印”Done 5.0”
print(“Starting “ + Time.time);
// WaitAndPrint作为一个Coroutine开始
yield WaitAndPrint();
print(“Done ” + Time.time);
function WaitAndPrint()
{
// 暂停执行5秒
yield WaitForSeconds(5);
print(“WaitAndPrint “ + Time.time);
}
WaitForEndOfFrame 类,继承自YieldInstruction
等待直到所有的相机和GUI被渲染完成,并在该帧显示在屏幕上之前。
你可以用它来读取显示到纹理中,编码它为一个图片(参考Texture2D.ReadPixels, Texture2D.EncodeToPNG)并发送它。
yield new WaitForEndOfFrame();
// 存储截屏为PNG文件
import System.IO;
// 立即截屏
function Start()
{
UploadPNG();
}
function UploadPNG()
{
// 在渲染完成后读取屏幕缓存
yield WatiForEndOfFrame();
// 创建一个屏幕大小的纹理,RGB24格式
var width = Screen.width;
var height = Screen.height;
var tex = new Texture2D(width, height, TextureFormat.RGB24, false);
// 读取屏幕内容到纹理
tex.ReadPixels(Rect(0, 0, width, height), 0 ,0);
tex.Apply();
// 编码纹理为PNG文件
var bytes = tex.EncodeToPNG();
Destroy(tex);
// 出于测试目的,也在工程文件夹中写一个文件
// File.WriteAllBytes(Application.dataPath – “/…/SavedScreen.png”, bytes);
// 创建一个Web表单
var form = new WWWForm();
form.AddField(“frameCount”, Time.frameCount.ToString());
form.AddBinaryData(“fileUpload”, bytes);
//上传到一个CGI脚本
var w = WWW(“http://localhost/cgi-bin/cnv.cgi?post”, form);
yield w;
if(w.error != null)
{
print(w.error);
}
else
{
print(Finished Uploading Screenshot”);
}
// 在游戏视图中显示alpha通道的内容,需要UnityPro因为这个脚本使用了GI类
private var mat : Material;
// 在该帧被完全渲染后,我们将绘制提取了alpha通道的一个全屏矩形
function Start ()
{
while(true)
{
yield WaitForEndOfFrame();
if(!mat)
{
mat = new Material(“Shader ” Hidden/Alpha “(“ + “SubShader { “ + “ Pass {“ + “ZTest Always Call off ZWrite off” + “Blend DstAlpha Zero” + “Color(1,1,1,1)” + “}” + “}” + “}”);
}
GL.PushMatrix();
GL.LoadOrtho();
for(var i=0;i<mat.passCount;++i)
{
mat.SetPass(i);
GL.Begin(GLQUADS);
GL.Vector3(0, 0, 0.1);
GL.Vector3(1, 0, 0.1);
GL.Vector3(1, 1, 0.1);
GL.Vector3(0, 1, 0.1);
GL.End();
}
GL.PopMatrix();
}
}
WaitForFixedUpdate 类,继承自YieldInstruction
等待直到下一个固定帧率更新函数。 参见: FixedUpdate
在coroutine中WaitFixedUpdate只能用于yield语句。
yield new WaitForFixedUpdate();
WaitForSeconds 类,继承自YieldInstruction
在给定的秒数内暂停协同进程的执行。
在coroutine中WaitForSeconds只能用于yield语句。
// 打印0
print(Time.time);
// 等待5秒
yield new WaitForSeconds(5);
// 打印5.0
print(Time.time);
构造函数
◆ static function WaitForSeconds(seconds : float) : WaitForSeconds
描述: 创建一个yield指令来等待给定的秒数。
// 打印0
print(Time.time);
// 等待5秒
yield new WaitForSeconds(5);
// 打印5.0
print(Time.time);
属性
AddComponentMenu 类,从Attribute继承。
AddComponentMenu属性允许你防止一个脚本到”Component”菜单的任何位置,而不仅是”Component->Scripts”菜单。
使用这个更好的组织Component菜单,这种方法可以在添加脚本时改善工作流程。重要提示:需要重启!
// JavaScript的例子
@script
AddComponentMenu(“Transform/FollowTransform”)
class FollowTransform : MonoBehaviour
{
}
// C#的例子
[AddComponentMenu(“Transform/FollowTransform”)]
class FollowTransform : MonoBehaviour
{
}
构造函数
◆ static function AddComponentMenu(menuName : string) : AddComponentMenu
描述: 这个脚本将根据menuName纺织在组件菜单中。menuName是组件的路径”Rendering/DoSomething”。如果menuName为””组件将从菜单中隐藏。如果menuName为””组件将从菜单中隐藏。
ContextMenu 类,从Attribute继承
ContextMenu属性允许你添加命令到上下文菜单。
在这个附加脚本的检视面板中。当用户选择这个上下文菜单,该函数将被执行。
这最适合用来从脚本中自动设置场景数据。这个函数必须是非静态的。
// JavaScript的例子
@ContextMenu(“Do Something”)
function DoSomething()
{
Debug.Log(“Perform operation”);
}
// C#的例子
class ContextTesting : MonoBehaviour
{
// 在脚本的检视面板中添加名为”Do Something”的上下文菜单
[ContextMenu(“Do Something”)]
void DoSomething()
{
Debug.Log(“Perform operation”);
}
}
构造函数
◆ static function ContextMenu(name : string) : ContextMenu
描述: 添加这个函数到组件的上下文菜单中。
在这个附加脚本的检视面板中。当用户选择这个上下文菜单后,该函数将被执行。
这最适合用来从脚本中自动设置场景的数据。这个函数必须是非静态的。
// JavaScript的例子
@ContextMenu(“Do Something”)
function DoSomething()
{
Debug.Log(“Perform operation”);
}
// C#的例子
class ContextTesting : MonoBehaviour
{
// 在脚本的检视面板中添加名为”Do Something”的上下文菜单
[ContextMenu(“Do Something”)]
void DoSomething()
{
Debug.Log(“Perform operation”);
}
}
ExecuteInEditMode 类,从Attribute继承
让脚本在编辑模式执行。
默认的,脚本只在运行模式时执行。这可以让这个脚本在编辑模式时执行。
@script
ExecuteInEditMode();
// 只是一个简单的脚本来查找目标变换
var target : Transform;
function Update()
{
if(target)
transform.LookAt(target);
}
HiddenInInspector类,从Attribute继承
使一个变量不会出现在检视面板中但是能被序列化。
// 使p不显示在检视面板中,但是能被序列化
@HiddenInInspector
var p = 5;
NonSerialized 类,从Attribute继承
NonSerialized属性标记一个变量没有被序列化。
用这种方法你能保持一个公开变量,并且Unity不会序列化它或在检视面板中显示它。
// p不会显示在检视面板中或被序列化
// JavaScript的例子
@System.NonSerialized
var p = 5;
// C#的例子
class Test
{
// p不会显示在检视面板中或者被序列化
[System.NonSerialized]
public int p = 5;
}
RPC 类,从Attribute继承
RenderBeforeQueues
类,从Attribute继承
定义在哪个渲染队列中OnRenderObject将被调用的属性。
参见: Render.queues,MonoBehaviour.OnRenderObject
// 在渲染不透明和透明物体之前OnRenderObject被调用
@RenderBeforeQueues(1000, 2000)
function OnRenderObject(queue : int)
{
// 做自定义的渲染
}
构造函数
◆ static function RenderBeforeQueues(params args : int[]) : RenderBeforeQueues
描述: 定义在哪个渲染队列中OnRenderObject将被调用。
参见: Render.queues,MonoBehaviour.OnRenderObject
// 在渲染不透明和透明物体之前OnRenderObject被调用
@RenderBeforeQueues(1000, 2000)
function OnRenderObject(queue : int)
{
// 做自定义的渲染
}
RequireComponent 类,从Attribute继承
这个RequireComponent属性自动添加所需组件作为一个依赖。
当使用RequireComponent添加一个脚本,这个需要的组件将自动被添加到游戏物体上,这可以用来避免设置错误。例如,一个脚本也许需要一个刚体添加到同一个游戏物体上。使用RequireComponent这个将被自动完成,因此不会出现设置错误。
// C#例子,标记PlayerScript需要一个刚体
[RequireComponent(typeof(Rigidbody))]
class PlayerScript : MonoBehaviour
{
void FixedUpdate()
{
rigidbody.AddForce(Vector3.up);
}
}
构造函数
◆ static function RequireComponent(requiredComponent : Type) : RequireComponent
描述: 请求添加一个组件。
◆ static function RequireComponent(requiredComponent : Type, requiredComponent2 : Type) : RequireComponent
描述: 请求添加两个组件。
◆ static function RequireComponent(requiredComponent : Type, requiredComponent2 : Type, requiredComponent3 : Type) : RequireComponent
描述: 请求添加三个组件。
Serializable 类,从Attribute继承
序列化属性允许你在检视面板中嵌入一个类的子属性。
你可以使用这个来在检视面板中显示一个变量,类似于Vector3显示在检视面板中。名称和一个三角形可以展开它的属性。你需要从System.Object派生一个类,并给它Serializable属性。在JavaScript中Serializable属性是隐式的并不是必须的。
class Test extends System.Object
{
var p = 5;
var c = Color.white;
}
var test = Test();
// C#的例子:
[System.Serializable]
class Test
{
public int p = 5;
public Color c= Color.white;
}
枚举
AnimationBlendMode
枚举
由Animation.Play函数使用。
值
◆ AnimationBlendMode.Additive
描述: 动画将被附加。
◆ AnimationBlendMode.Blend
描述: 动画将被混合
AudioVelocityUpdateMode
枚举
描述: 一个AudioSource或AudioListener何时被更新。
值
◆ AudioVelocityUpdateMode.Auto
描述: 如果源或侦听器附加在一个Rigidbody上就以固定更新循环更新它,否则使用动态的。
◆ AudioVelocityUpdateMode.Dynamic
描述: 以动态的更新循环更新源或者侦听器。
◆ AudioVelocityUpdateMode.Fixed
描述: 以固定的更新循环更新源或者侦听器。
CameraClearFlags
枚举
Camera.clearFlags值用来决定在渲染一个Camera时清除什么。
参见: camera组件
值
◆ CameraClearFlags.Depth
描述: 只清除深度缓存。
这将留下前一帧的颜色或者任何被显示的东西。
// 只清除深度缓存
camera.clearFlags = CameraClearFlags.Depth;
参见: Camera.clearFlags属性,camera组件
◆ CameraClearFlags.Nothing
描述: 不清除任何东西。
这将留下前一帧的颜色的深度缓存或者任何被显示的东西。
// 不清除任何东西
camera.clearFlags = CameraClearFlags.Nothing;
参见: Camera.clearFlags属性,camera组件
◆ CameraClearFlags.Skybox
描述: 用天空盒清除。
如果没有设置天空盒,相机将继续使用backgroundColor来清除。
// 用天空盒清除
camera.clearFlags = CameraClearFlags.Skybox;
参见: Camera.clearFlags属性,camera组件,Render设置
◆ CameraClearFlags.SolidColor
描述: 用背景颜色清除
camera.clearFlags = CameraClearFlags.SolidColor;
参见: Camera.clearFlags属性,camera组件,Camera.backgroundColor属性
CollisionFlags
枚举
CollisionFlags是由CharacterController.Move返回的一个bitmask。
它给你一个角色和其他任何物体碰撞的大概位置。
值
◆ CollisionFlags.Above
描述: CollisionFlags是由CharacterController.Move返回的一个bitmask。它给你一个角色和其他任何物体碰撞的大概位置。
function Update() {
var controller : CharacterController = GetComponent(CharacterController);
if(controller.collisionFlags == CollisionFlags.None)
print(“Free floating!”);
if(controller.collisionFlags & CollisionFlags.Sides)
print(“Touching sides!”);
if(controller.collisionFlags == CollisionFlags.Sides)
print(“Only touching sides, nothing else!”);
if(controller.collisionFlags & CollisionFlags.Above)
print(“Touching ceiling!”);
if(controller.collisionFlags == CollisionFlags.Above)
print(“Only touching ceiling, nothing else!”);
if(controller.collisionFlags & CollisionFlags.Below)
print(“Touching ground!”);
if(controller.collisionFlags == CollisionFlags.Below)
print(“Only touching ground, nothing else!”);
}
◆ CollisionFlags.Below
描述: CollisionFlags是由CharacterController.Move返回的一个bitmask。它给你一个角色和其他任何物体碰撞的大概位置。
function Update() {
var controller : CharacterController = GetComponent(CharacterController);
if(controller.collisionFlags == CollisionFlags.None)
print(“Free floating!”);
if(controller.collisionFlags & CollisionFlags.Sides)
print(“Touching sides!”);
if(controller.collisionFlags == CollisionFlags.Sides)
print(“Only touching sides, nothing else!”);
if(controller.collisionFlags & CollisionFlags.Above)
print(“Touching ceiling!”);
if(controller.collisionFlags == CollisionFlags.Above)
print(“Only touching ceiling, nothing else!”);
if(controller.collisionFlags & CollisionFlags.Below)
print(“Touching ground!”);
if(controller.collisionFlags == CollisionFlags.Below)
print(“Only touching ground, nothing else!”);
}
◆ CollisionFlags.None
描述: CollisionFlags是由CharacterController.Move返回的一个bitmask。它给你一个角色和其他任何物体碰撞的大概位置。
function Update() {
var controller : CharacterController = GetComponent(CharacterController);
if(controller.collisionFlags == CollisionFlags.None)
print(“Free floating!”);
if(controller.collisionFlags & CollisionFlags.Sides)
print(“Touching sides!”);
if(controller.collisionFlags == CollisionFlags.Sides)
print(“Only touching sides, nothing else!”);
if(controller.collisionFlags & CollisionFlags.Above)
print(“Touching ceiling!”);
if(controller.collisionFlags == CollisionFlags.Above)
print(“Only touching ceiling, nothing else!”);
if(controller.collisionFlags & CollisionFlags.Below)
print(“Touching ground!”);
if(controller.collisionFlags == CollisionFlags.Below)
print(“Only touching ground, nothing else!”);
}
◆ CollisionFlags.Sides
描述: CollisionFlags是由CharacterController.Move返回的一个bitmask。它给你一个角色和其他任何物体碰撞的大概位置。
function Update() {
var controller : CharacterController = GetComponent(CharacterController);
if(controller.collisionFlags == CollisionFlags.None)
print(“Free floating!”);
if(controller.collisionFlags & CollisionFlags.Sides)
print(“Touching sides!”);
if(controller.collisionFlags == CollisionFlags.Sides)
print(“Only touching sides, nothing else!”);
if(controller.collisionFlags & CollisionFlags.Above)
print(“Touching ceiling!”);
if(controller.collisionFlags == CollisionFlags.Above)
print(“Only touching ceiling, nothing else!”);
if(controller.collisionFlags & CollisionFlags.Below)
print(“Touching ground!”);
if(controller.collisionFlags == CollisionFlags.Below)
print(“Only touching ground, nothing else!”);
}
ConfigurableJointMotion
枚举
沿着6个轴限制ConfigurableJoint的移动。
值
◆ ConfigurableJointMotion.Free
描述: 沿着这个轴的运动将是完全自由和完全无约束的。
◆ ConfigurableJointMotion.Limited
描述: 沿着这个轴的运动将被分别限制。
◆ ConfigurableJointMotion.Locked
描述: 沿着这个轴的运动将被锁定。
ConnectionTesterStatus
枚举
值
◆ ConnectionTesterStatus.Error
描述:
◆ ConnectionTesterStatus.PrivateIPHasNATPunchThrough
描述: 私有地址被检测到并且能做NAT穿透。
◆ ConnectionTesterStatus. PrivateIPNoNATPunchThrough
描述: 私有地址被检测到并且不能做NAT穿透。
◆ ConnectionTesterStatus.PublicIPIsConnectable
描述: 公有的IP地址被检测到并且游戏的侦听端口可以通过互联网访问。
◆ ConnectionTesterStatus.PublicIPNoServerStarted
描述: 公有的IP地址被检测到但是服务器没有被初始化并且没有侦听端口。
◆ ConnectionTesterStatus.PublicIPPortBlocked
描述: 公有的IP地址被检测到但是它的端口不能通过互联网连接。
◆ ConnectionTesterStatus.Undetermined
描述: 测试结果未知,还在进行中。
CubemapFace
枚举
Cubemap面。
被Cubemap.GetPixel和Cubemap.SetPixel。
值
PositiveX 右面(+x)
NegativeX 左面(-x)
PostiveY 上面(+y)
NegativeY 下面(-y)
PostiveZ 前面(+z)
NegativeZ 后面(-z)
EventType
枚举
UnityGUI输入和处理事件的类型。
参见: Event.type, Event,GUI脚本手册。
值
◆ EventType.ContexClick
描述: 用户使用右键单机(或者在mac上的Control+单机)。
如果是窗口的应用,应该显示一个上下文菜单。在编辑器中只发送。
◆ EventType.DragExited
描述: 只限于编辑器,存在的拖放操作。
参见: DragAndDrop类
◆ EventType.DragPerform
描述: 只限于编辑器,拖放操作执行。
参见: DragAndDrop类
◆ EventType.DragUpdated
描述: 只限于编辑器,拖放操作更新。
参见: DragAndDrop类
◆ EventType.ExecuteCommand
描述: 执行特殊的命令(例如,拷贝和粘贴)。
“Copy”,”Cut”,”Paste”,”Delete”,”FrameSelected”,”Duplicate”,”SelectAll”
◆ EventType.Ignore
描述: Event应该被忽略。
这个事件被临时禁用并应该被忽略。
◆ EventType.KeyDown
描述: 一个键盘按键被按下。
使用Event.character查看什么被键入。使用Event.keyCode处理箭头,home/end或其他任何功能键,或者找到哪个物理键被按下。这个事件根据端用户键盘的重复设置来重复发送。
注意按键可以来自不同的事件,一个是Event.keyCode,另一个是Event.chatacter,根据键盘布局,多个Event.keyCode可以产生一个Event.character事件。
◆ EventType.KeyUp
描述: 一个键盘按键被释放。
使用Event.keyCode查看哪个物理按键被释放。注意根据系统和键盘布局的不同,Event.character也许不包含任何字符。
◆ EventType.Layout
描述: 一个布局事件。
这个事件先于其他任何事件被发送。这是一个几回来执行任何初始化,它被用于自动布局系统。
◆ EventType.MouseDown
描述: 鼠标按键被按下。
当任何鼠标按键被按下的时候发送该事件 - 使用Event.button决定哪个按键被按下。
◆ EventType.MouseDrag
描述: 鼠标被拖动。
鼠标移动并且按键被按下 – 拖动鼠标。使用Event.mousePosition和Event.delta来决定鼠标移动。
◆ EventType.MouseMove
描述: 鼠标被移动。
鼠标移动,没有任何按键被按下。使用Event.mousePosition和Event.delta来确定鼠标移动。
◆ EventType.MouseUp
描述: 鼠标按键被释放。
当任何鼠标按键被释放时发送该事件。使用Event.button决定哪个按键被释放。
◆ EventType.Repaint
描述: 一个重绘事件。每帧发送一个。
首先处理所有的其他事件,然后这个重绘事件被发送。
◆ EventType.ScrollWheel
描述: 滚轮被滚动。
使用Event.delta决定X和Y的滚动量。
◆ EventType.Used
描述: 已处理的事件。
这个事件已经被其他的一些控件使用并应该被忽略。
◆ EventType.ValidateCommand
描述: 验证特殊的命令(例如,拷贝和粘贴)。
“Copy”,”Cut”,”Paste”,”Delete”,”FrameSelected”,”Duplicate”,”SelectAll”等等,只在编辑器中发送。
FilterMode
纹理的过滤模式。对应于texture.inspector中的设置。
参见: Texture.filterMode,texture.assets
值
◆ FilterMode.Bilinear
描述: 双线性过滤 – 纹理被平均采样。
renderer.material.mainTexture.filterMode = FilterMode.Bilinear;
参见: Texture.filterMode,texture assets
◆ FilterMode.Point
描述: 点过滤 – 纹理像素变得近乎斑驳。
renderer.material.mainTexture.filterMode = FilterMode.Point;
参见: Texture.filterMode,texture assets
◆ FilterMode.Trilinear
描述: 三线性过滤 – 纹理被平均采样并在mipmap等级之间混合。
renderer.material.mainTexture.filterMode = FilterMode.Trilinear;
参见: Texture.filterMode,texture assets
FocusType
被GUIUtility.GetControlID使用来通知UnityGUI系统给定的空间能否获取键盘焦点。
值
◆ FocusType.Keyborad
描述: 这是一个何时的键盘控制。在所有平台上它都能有输入焦点。用于TextField和TextArea控件。
◆ FocusType.Native
描述: 这个空间可以在Windows下获取焦点,但是在Mac下不能。用于按钮,复选框和其他的“可按下”物体。
◆ FocusType.Passive
描述: 这个控件永远不能接收键盘焦点。
ForceMode
Rigidbody.AddForce如何使用力的选项。
值
◆ ForceMode.Acceleration
描述: 添加一个牛顿力到这个刚体,忽略它的质量。
这个模式不依赖于刚体的质量。因此推和旋转的应用将不会受到刚体质量的影响,相对于ForceMode.Force这将以相同的设置移动每个刚体而忽略它们的质量差别。这个模式更像一个加速度而不是速度。在这个模式线,应用到物体的力参数的单位是距离/时间^2。
◆ ForceMode.Force
描述: 添加一个牛顿力到这个刚体,使用它的质量。
这个模式依赖于刚体的质量。因此,必须对较大的质量的物体应用更多的力来推动或旋转它。这模式更像一个加速度而不是速度。在这个模式线,应用到物体的力的参数的单位是质量*距离/时间^2。
◆ ForceMode.Impulse
描述: 用刚体的质量改变它的速度。
这个模式依赖于刚体的质量。因此,必须对较大质量的物体应用更多的力来推动或旋转
它。这模式更像一个速度而不是加速度。在这个模式线,应用到物体的力的参数是质量*距离/时间。
◆ ForceMode.VelocityChange
描述: 改变刚体的速度。忽略它的质量。
这个模式不依赖于刚体的质量。因此推和旋转的应用将不会受到刚体质量的影响。这可用于控制不同尺寸的飞船而不考虑质量差别。在这个模式,应用到物体的力的参数的单位是距离/时间。
HideFlags
Bit蒙板,可以控制对象销毁和在检视面板中的可视性。
值
◆ HideFlag.DontSave
描述: 这个物体将不会被保存到场景。当一个新的场景被加载时它将不会被销毁。
使用DestroyImmediate手工清理这个物体是你的责任,否则它将泄漏。
◆ HideFlags.HideAndDontSave
描述: 不显示在层次视图中并且不保存到场景的组合。
这个最常用于那些由脚本创建并纯粹在它控制之下的物体。
◆ HideFlags.HideInHierarchy
描述: 如果这个对象是储存在一个资源中,这个对象将不会显示在层次视图中并且不会显示在工程视图中。
◆ HideFlags.HideInInspector
描述: 不能在检视面板中查看。
◆ HideFlags.NotEditable
描述: 这个物体在检视面板中不可编辑。
ImagePosition
在GUIStyle中图片和文本如何被放置。
值
◆ ImagePosition.ImageAbove
描述: 图片在文本上面。
◆ ImagePosition.ImageLeft
描述: 图片在文本左侧。
◆ ImagePosition.ImageOnly
描述: 只有这个图片被显示。
◆ ImagePosition.TextOnly
描述: 只有这个文本被显示。
JointDriveMode
ConfigurableJoint试图基于这个表示来达到这个位置/速度的目的。
值
◆ JointDriveMode.None
描述: 不用任何力来达到目标。
◆ JointDriveMode.Position
描述: 尽量达到特定的位置。
◆ JointDriveMode.PositionAndVelocity
描述: 尽量达到特定的位置和速度。
◆ JointDriveMode.Velocity
描述: 尽量达到特定的速度。
JointProjectionMode
该属性用来决定在物体偏离太多的时候如果它吸附到约束位置。
参见: ConfigurableJoint
值
◆ JointProjectionMode.None
描述: 不吸附。
◆ JointProjectionMode.PositionAndRotation
描述: 吸附到位置和旋转。
◆ JointProjectionMode.PositionOnly
描述: 只吸附到位置。
KeyCode
KeyCode是由Event.keyCode返回的。这些直接映射到键盘上的物理键。
值
Backspace 退格键
Delete Delete键
TabTab键
Clear Clear键
Return 回车键
Pause 暂停键
Escape ESC键
Space 空格键
Keypad0 小键盘0
Keypad1 小键盘1
Keypad2 小键盘2
Keypad3 小键盘3
Keypad4 小键盘4
Keypad5 小键盘5
Keypad6 小键盘6
Keypad7 小键盘7
Keypad8 小键盘8
Keypad9 小键盘9
KeypadPeriod 小键盘“.”
KeypadDivide 小键盘“/”
KeypadMultiply小键盘“*”
KeypadMinus 小键盘“-”
KeypadPlus 小键盘“+”
KeypadEnter 小键盘“Enter”
KeypadEquals 小键盘“=”
UpArrow 方向键上
DownArrow 方向键下
RightArrow 方向键右
LeftArrow 方向键左
Insert Insert键
Home Home键
EndEnd键
PageUp PageUp键
PageDown PageDown键
F1功能键F1
F2功能键F2
F3功能键F3
F4功能键F4
F5功能键F5
F6功能键F6
F7功能键F7
F8 功能键F8
F9 功能键F9
F10 功能键F10
F11 功能键F11
F12 功能键F12
F13 功能键F13
F14 功能键F14
F15 功能键F15
Alpha0 按键0
Alpha1 按键1
Alpha2 按键2
Alpha3 按键3
Alpha4 按键4
Alpha5 按键5
Alpha6 按键6
Alpha7 按键7
Alpha8 按键7
Alpha9 按键9
Exclaim ‘!’键
DoubleQuote双引号键
Hash Hash键
Dollar ‘$’键
AmpersandAmpersand键
Quote 单引号键
LeftParen 左括号键
RightParen右括号键
Asterisk ‘ * ’键
Plus ‘ + ’键
Comma ‘ , ’键
Minus ‘ - ’键
Period ‘ . ’键
Slash ‘ / ’键
Colon ‘ : ’键
Semicolon‘ ; ’键
Less ‘ < ‘键
Equals ‘ = ‘键
Greater ‘ > ‘键
Question ‘ ? ’键
At ‘@’键
LeftBracket‘ [ ‘键
Backslash ‘ ’键
RightBracket‘ ] ’键
Caret ‘ ^ ’键
Underscore‘ _ ’键
BackQuote‘ ` ’键
A ‘a’键
B ‘b’键
C ‘c’键
D ‘d’键
E ‘e’键
F ‘f’键
G ‘g’键
H ‘h’键
I ‘i’键
J ‘j’键
K ‘k’键
L ‘l’键
M ‘m’键
N ‘n’键
O ‘o’键
P ‘p’键
Q ‘q’键
R ‘r’键
S ‘s’键
T ‘t’键
U ‘u’键
V ‘v’键
W ‘w’键
X ‘x’键
Y ‘y’键
Z ‘z’键
Numlock Numlock键
Capslock 大小写锁定键
ScrollLockScroll Lock键
RightShift 右上档键
LeftShift 左上档键
RightControl右Ctrl键
LeftControl左Ctrl键
RightAlt 右Alt键
LeftAlt 左Alt键
LeftApple 左Apple键
LeftWindows左Windows键
RightApple右Apple键
RightWindows右Windows键
AltGr Alt Gr键
Help Help键
Print Print键
SysReq Sys Req键
Break Break键
Mouse0 鼠标左键
Mouse1 鼠标右键
Mouse2 鼠标中键
Mouse3 鼠标第3个按键
Mouse4 鼠标第4个按键
Mouse5 鼠标第5个按键
Mouse6 鼠标第6个按键
JoystickButton0手柄按键0
JoystickButton1手柄按键1
JoystickButton2手柄按键2
JoystickButton3手柄按键3
JoystickButton4手柄按键4
JoystickButton5手柄按键5
JoystickButton6手柄按键6
JoystickButton7手柄按键7
JoystickButton8手柄按键8
JoystickButton9手柄按键9
JoystickButton10手柄按键10
JoystickButton11手柄按键11
JoystickButton12手柄按键12
JoystickButton13手柄按键13
JoystickButton14手柄按键14
JoystickButton15手柄按键15
JoystickButton16手柄按键16
JoystickButton17手柄按键17
JoystickButton18手柄按键18
JoystickButton19手柄按键19
Joystick1Button0第一个手柄按键0
Joystick1Button1第一个手柄按键1
Joystick1Button2第一个手柄按键2
Joystick1Button3第一个手柄按键3
Joystick1Button4第一个手柄按键4
Joystick1Button5第一个手柄按键5
Joystick1Button6第一个手柄按键6
Joystick1Button7第一个手柄按键7
Joystick1Button8第一个手柄按键8
Joystick1Button9第一个手柄按键9
Joystick1Button10第一个手柄按键10
Joystick1Button11第一个手柄按键11
Joystick1Button12第一个手柄按键12
Joystick1Button13第一个手柄按键13
Joystick1Button14第一个手柄按键14
Joystick1Button15第一个手柄按键15
Joystick1Button16第一个手柄按键16
Joystick1Button17第一个手柄按键17
Joystick1Button18第一个手柄按键18
Joystick1Button19第一个手柄按键19
Joystick2Button0第二个手柄按键0
Joystick2Button1第二个手柄按键1
Joystick2Button2第二个手柄按键2
Joystick2Button3第二个手柄按键3
Joystick2Button4第二个手柄按键4
Joystick2Button5第二个手柄按键5
Joystick2Button6第二个手柄按键6
Joystick2Button7第二个手柄按键7
Joystick2Button8第二个手柄按键8
Joystick2Button9第二个手柄按键9
Joystick2Button10第二个手柄按键10
Joystick2Button11第二个手柄按键11
Joystick2Button12第二个手柄按键12
Joystick2Button13第二个手柄按键13
Joystick2Button14第二个手柄按键14
Joystick2Button15第二个手柄按键15
Joystick2Button16第二个手柄按键16
Joystick2Button17第二个手柄按键17
Joystick2Button18第二个手柄按键18
Joystick2Button19第二个手柄按键19
Joystick3Button0第三个手柄按键0
Joystick3Button1第三个手柄按键1
Joystick3Button2第三个手柄按键2
Joystick3Button3第三个手柄按键3
Joystick3Button4第三个手柄按键4
Joystick3Button5第三个手柄按键5
Joystick3Button6第三个手柄按键6
Joystick3Button7第三个手柄按键7
Joystick3Button8第三个手柄按键8
Joystick3Button9第三个手柄按键9
Joystick3Button10第三个手柄按键10
Joystick3Button11第三个手柄按键11
Joystick3Button12第三个手柄按键12
Joystick3Button13第三个手柄按键13
Joystick3Button14第三个手柄按键14
Joystick3Button15第三个手柄按键15
Joystick3Button16第三个手柄按键16
Joystick3Button17第三个手柄按键17
Joystick3Button18第三个手柄按键18
Joystick3Button19第三个手柄按键19
LightRenderMode
Light如何被渲染。
参见: light组件
值