废话不多说,一针见血,go!
一起来看 API
Caching.Authorize 授权
授权这个Unity内容使用缓存
Caching.CleanCache 清除缓存
删除这个内容相关的缓存文件夹
当你已经有一个缓存许可证时,这个函数才能激活
Caching.Authorize (name, domain, size, signature);
if (GUILayout.Button("Uninstall Game"))
Caching.CleanCache ();
Caching.enabled 启用
缓存是否启用?
if (!Caching.enabled)
GUILayout.Label ("Please turn on caching to run this game.");
Caching.expirationDelay 截止延迟(啥?)
Caching 缓存
Caching类让你管理资源包缓存,下载使用
Caching.IsVersionCached 是否缓存的版本
检查,如果一个资源包被缓存
if (Caching.IsVersionCached("http://myserver.com/bla.unity3d", 3))
GUILayout.Button("Load Level");
Caching.ready 准备
Caching.spaceFree 剩余空间
可用的磁盘空间,以bytes(字节)为单位
Caching.spaceOccupied 占用空间
已经使用的磁盘空间,以bytes(字节)为单位
Camera.actualRenderingPath 实际渲染路径
实际使用的渲染路径
Camera.allCameras 所有相机
返回场景中所有启用的相机
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public int count = Camera.allCameras.Length;
public void Awake()
{
print("We've got " + count + " cameras");
}
}
Camera.aspect 宽长比
宽长比(宽度除以高度)
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
if (camera.aspect > 1.0F)
print("Screen is more wide than tall!");
else
print("Screen is more tall than wide!");
}
}
Camera.backgroundColor 背景颜色
屏幕将被清理为这个颜色
来回变化背景颜色
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Color color1 = Color.red;
public Color color2 = Color.blue;
public float duration = 3.0F;
void Update()
{ //设置消除标识到颜色
float t = Mathf.PingPong(Time.time, duration) / duration;
camera.backgroundColor = Color.Lerp(color1, color2, t);
}
public void Awake()
{
camera.clearFlags = CameraClearFlags.SolidColor;
}
}
Camera.cameraToWorldMatrix 相机转世界矩阵
从相机空间到世界空间的变换矩阵
在屏幕视图绘制一个黄色的球,以Distance单位,沿着相机所看方向
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public float distance = -1.0F;
void OnDrawGizmosSelected()
{
Matrix4x4 m = camera.cameraToWorldMatrix;
Vector3 p = m.MultiplyPoint(new Vector3(0, 0, distance));
Gizmos.color = Color.yellow;
Gizmos.DrawSphere(p, 0.2F);
}
}
Camera.clearFlags 清除标识
相机如何清除背景
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //用背景颜色清除(忽略天空盒)
camera.clearFlags = CameraClearFlags.SolidColor;
}
}
Camera.CopyFrom 复制到
使这个相机的设置与其他相机相同
Camera.cullingMask 消隐遮罩
这个用来选择性的渲染部分场景
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //只渲染在第一层中的物体(默认层)
camera.cullingMask = 1 << 0;// 1/1
}
}
Camera.current 当前相机
当前用于渲染的相机,只用于低级的渲染控制
Camera.depth 深度
相机在渲染顺序上的深度
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //设置这个相机在主相机之后渲染
camera.depth = Camera.main.depth + 1;
}
}
Camera.depthTextureMode 深度纹理模式
相机生成怎样的一个深度纹理
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //生成一个深度+法线纹理
camera.depthTextureMode = DepthTextureMode.DepthNormals;
}
}
Camera.farClipPlane 远裁剪平面
远裁剪面的距离(啥玩意)
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
camera.farClipPlane = 100.0F;
}
}
Camera.fieldOfView 固定视野
相机的视野,以度为单位
例一
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //设置附加到同一个游戏物体上相机的视野为60
camera.fieldOfView = 60;
}
}
例二
使用专门主相机
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //设置主相机的视野为 80
Camera.main.fieldOfView = 80;
}
}
Camera 摄像机
Camera是一个设备,玩家通过它看世界
Camera.layerCullDistances 层消隐距离
每层的消隐距离(不懂)
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Start()
{
float[] distances = new float[32];
//设置层10的消隐为15米距离,其他所有层使用远剪裁屏幕距离
distances[10] = 15;
camera.layerCullDistances = distances;
}
}
Camera.main 主相机
第一个启用的被标记为“MainCanmera”的相机
Camera.nearClipPlane 近裁剪平面
近裁剪面的距离
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
camera.nearClipPlane = 0.1F;
}
}
Camera.OnPostRender 在渲染之后
OnPostRender 在相机渲染场景之后调用
这个脚本让你在每个相机开启/禁用雾效
在检视面板开启或禁用这个脚本
在每个相机可以开启/禁用雾效
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
private bool revertFogState = false;
void OnPreRender()
{
revertFogState = RenderSettings.fog;
RenderSettings.fog = enabled;
}
void OnPostRender()
{
RenderSettings.fog = revertFogState;
}
}
Camera.OnPreCull 在消隐之前
OnPreCull在相机开始裁剪场景之前调用
附加这个到相机
反转相机中的物体,因此每个被渲染的物体是反的(?)
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnPreCull()
{
camera.ResetWorldToCameraMatrix();
camera.ResetProjectionMatrix();
camera.projectionMatrix = camera.projectionMatrix * Matrix4x4.Scale(new Vector3(1, -1, 1));
}
void OnPreRender()
{ //设置为true,因此可以看到翻转的物体
GL.SetRevertBackfacing(true);
}
void OnPostRender()
{ //设置为false,因为不想影响所有其他相机
GL.SetRevertBackfacing(false);
}
}
Camera.OnPreRender 在渲染之前
OnPreRender在相机开始渲染场景之前调用
这个脚本让你在每个相机开启/禁用雾效
在检视面板开启或禁用这个脚本
在每个相机可以开启/禁用雾效
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
private bool revertFogState = false;
void OnPreRender()
{
revertFogState = RenderSettings.fog;
RenderSettings.fog = enabled;
}
void OnPostRender()
{
RenderSettings.fog = revertFogState;
}
}
Camera.OnRenderImage 在渲染图像之后
OnRenderImage在所有渲染完成后被调用,来渲染图片的后期处理效果
Camera.OnRenderObject 在渲染物体之后
OnRenderObject 被用来渲染你自己的物体,使用或者其他函数
Camera.OnWillRenderObject 在渲染物体之前
如果物体可见,每个相机都会调用OnWillRenderObject
增加otherObject的大小同时这个变换正在渲染
注意这个将被调用即使场景编辑器显示这个物体
因此,请确保在游戏视图看不到的物体,不在场景编辑器
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public GameObject otherObject;
void OnWillRenderObject()
{
otherObject.transform.localScale *= 1.0001F;
}
}
Camera.orthographic 正交
相机是正交的(true),是透视的(false)?
例一
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //设置相机为正交
camera.orthographic = true;
}
}
例二
用于专门的主相机
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //设置主相机为正交
Camera.main.orthographic = true;
}
}
Camera.orthographicSize 正交大小
在正交模式下相机的一半尺寸
例一
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //设置相机的正交尺寸为5
camera.orthographic = true;
camera.orthographicSize = 5;
}
}
例二
使用专门的主相机
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //设置主相机的正交尺寸为5
Camera.main.orthographic = true;
Camera.main.orthographicSize = 5;
}
}
Camera.pixelHeight 相机高度
相机有多高,以像素单位
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
print("Camera is " + camera.pixelWidth + " pixels wide");
}
}
Camera.pixelRect 像素矩形
相机被渲染到屏幕像素中的位置
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Update()
{
Rect r = camera.pixelRect;
print("Camera displays from " + r.xMin + " to " + r.xMax + " pixel");
}
}
Camera.pixelWidth 相机宽度
相机有多宽,以像素单位
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
print("Camera is " + camera.pixelWidth + " pixels wide");
}
}
Camera.projectionMatrix 投影矩阵
设置自定义的投影矩阵
例一
让相机以流行的方式晃动
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Matrix4x4 originalProjection;
void Update()
{
Matrix4x4 p = originalProjection;
//改变原始矩阵的某些值
p.m01 += Mathf.Sin(Time.time * 1.2F) * 0.1F;
p.m10 += Mathf.Sin(Time.time * 1.5F) * 0.1F;
camera.projectionMatrix = p;
}
public void Awake()
{
originalProjection = camera.projectionMatrix;
}
}
例二
设置一个偏移中心的投影,这个透视的消失点没有必要在屏幕的中心
定义近载面大小,例如相机的近裁面偏移中心多少
改变这个值你就能看到相机视图的变化
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public float left = -0.2F;
public float right = 0.2F;
public float top = 0.2F;
public float bottom = -0.2F;
void LateUpdate()
{
Camera cam = camera;
Matrix4x4 m = PerspectiveOffCenter(left, right, bottom, top, cam.nearClipPlane, cam.farClipPlane);
cam.projectionMatrix = m;
}
static Matrix4x4 PerspectiveOffCenter(float left, float right, float bottom, float top, float near, float far) {
float x = 2.0F * near / right - left;
float y = 2.0F * near / top - bottom;
float a = right + left / right - left;
float b = top + bottom / top - bottom;
float c = -far + near / far - near;
float d = -2.0F * far * near / far - near;
float e = -1.0F;
Matrix4x4 m;
m[0, 0] = x;
m[0, 1] = 0;
m[0, 2] = a;
m[0, 3] = 0;
m[1, 0] = 0;
m[1, 1] = y;
m[1, 2] = b;
m[1, 3] = 0;
m[2, 0] = 0;
m[2, 1] = 0;
m[2, 2] = c;
m[2, 3] = d;
m[3, 0] = 0;
m[3, 1] = 0;
m[3, 2] = e;
m[3, 3] = 0;
return m;
}
}
Camera.rect 矩形
相继被渲染到屏幕规范化坐标中的位置
Rect的范围总0(左/下)到1(右/上)
//每次按下空格键时改变视口宽度
function Update () {
if (Input.GetButtonDown ("Jump"))
{
//随机选择边缘
var margin = Random.Range (0.0, 0.3);
//设置矩形
camera.rect = Rect (margin, 0, 1 - margin * 2, 1);
}
}
Camera.Render 渲染
手动渲染相机
Camera.renderingPath 渲染路径
渲染路径
Camera.RenderToCubemap 渲染到立方图
从这个相机渲染到一个立方贴图(不懂)
例一
//从给定的点渲染香精到以静态立方贴图
//放置这个脚本到工程的Editor文件夹中
//然后用一个Reflective shaders 来使用这个立方贴图
class RenderCubemapWizard extends ScriptableWizard {
var renderFromPosition : Transform;
var cubemap : Cubemap;
function OnWizardUpdate () {
helpString = "Select transform to render from and cubemap to render into";
isValid = (renderFromPosition != null) && (cubemap != null);
}
function OnWizardCreate () {
//为渲染创建临时相机
var go = new GameObject( "CubemapCamera", Camera );
//放置它到物体上
go.transform.position = renderFromPosition.position;
go.transform.rotation = Quaternion.identity;
//渲染到立方贴图
go.camera.RenderToCubemap( cubemap );
//销毁临时相机
DestroyImmediate( go );
}
@MenuItem("GameObject/Render into Cubemap")
static function RenderCubemap () {
ScriptableWizard.DisplayWizard.<RenderCubemapWizard>(
"Render cubemap", "Render!");
}
}
例二
//附加这个脚本到使用了Reflective shader的物体上
//实时反射立方贴图
@script ExecuteInEditMode
var cubemapSize = 128;
var oneFacePerFrame = false;
private var cam : Camera;
private var rtex : RenderTexture;
function Start () {
//在启动时渲染所有六个面
UpdateCubemap( 63 );
}
function LateUpdate () {
if (oneFacePerFrame)
{
var faceToRender = Time.frameCount % 6;
var faceMask = 1 << faceToRender;
UpdateCubemap (faceMask);
}
else
{
UpdateCubemap (63); //所有六个面
}
}
function UpdateCubemap (faceMask : int) {
if (!cam)
{
var go = new GameObject ("CubemapCamera", Camera);
go.hideFlags = HideFlags.HideAndDontSave;
go.transform.position = transform.position;
go.transform.rotation = Quaternion.identity;
cam = go.camera;
cam.farClipPlane = 100; //不要渲染较远的部分
cam.enabled = false;
}
if (!rtex)
{
rtex = new RenderTexture (cubemapSize, cubemapSize, 16);
rtex.isPowerOfTwo = true;
rtex.isCubemap = true;
rtex.hideFlags = HideFlags.HideAndDontSave;
renderer.sharedMaterial.SetTexture ("_Cube", rtex);
}
cam.transform.position = transform.position;
cam.RenderToCubemap (rtex, faceMask);
}
function OnDisable () {
DestroyImmediate (cam);
DestroyImmediate (rtex);
}
Camera.RenderWithShader 用Shader渲染
用shader替代渲染相机
Camera.ResetAspect 重设长宽比
恢复长宽比为屏幕的长宽比
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
camera.ResetAspect();
}
}
Camera.ResetProjectionMatrix 重设投影矩阵
让投影反映正常的相机参数(?)
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
camera.ResetProjectionMatrix();
}
}
Camera.ResetReplacementShader 重设替换Shader
从相机上移除shader替换(what?)
Camera.ResetWorldToCameraMatrix 重设世界转相机矩阵
在场景中让渲染位置反映相机的位置
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
camera.ResetWorldToCameraMatrix();
}
}
Camera.ScreenPointToRay 屏幕位置转射线
返回一条射线从摄像机通过一个屏幕点
打印相机直接看到物体名称
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Update()
{ //获取穿过屏幕中心的射线
Ray ray = camera.ViewportPointToRay(new Vector3(0.5F, 0.5F, 0));
//投射
RaycastHit hit;
if (Physics.Raycast(ray, ref hit))
print("I'm looking at " + hit.transform.name);
else
print("I'm looking at nothing!");
}
}
Camera.ScreenToViewportPoint 屏幕转视窗位置
从屏幕空间到视窗空间的变换位置
Camera.ScreenToWorldPoint 屏幕转世界位置
从屏幕空间到世界空间的变化位置
在所选相机的近裁剪面上,绘制一个黄色的球,在左下100像素的位置
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnDrawGizmosSelected()
{
Vector3 p = camera.ScreenToWorldPoint(new Vector3(100, 100, camera.nearClipPlane));
Gizmos.color = Color.yellow;
Gizmos.DrawSphere(p, 0.1F);
}
}
Camera.SetReplacementShader 设置替换Shader
使相机渲染用shader替换
Camera.targetTexture 目标纹理
渲染纹理的目标
Camera.velocity 速度
获取世界空间中相机的速度
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Update()
{
print("Camera moving at " + camera.velocity.magnitude + " m/s");
}
}
Camera.ViewportPointToRay 视窗位置转射线
返回从相机出发穿过视点的一个射线
打印相机直接看到物体名称
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Update()
{ //获取穿过屏幕中心的射线
Ray ray = camera.ViewportPointToRay(new Vector3(0.5F, 0.5F, 0));
//投射
RaycastHit hit;
if (Physics.Raycast(ray, ref hit))
print("I'm looking at " + hit.transform.name);
else
print("I'm looking at nothing!");
}
}
Camera.ViewportToScreenPoint 视窗转屏幕位置
从视口空间到屏幕空间的变换位置
Camera.ViewportToWorldPoint 视窗转世界位置
从视窗空间到世界空间的变换位置
在近裁剪面的右上角绘制一个黄色的球,针对在场景视图中选中的相机
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnDrawGizmosSelected()
{
Vector3 p = camera.ViewportToWorldPoint(new Vector3(1, 1, camera.nearClipPlane));
Gizmos.color = Color.yellow;
Gizmos.DrawSphere(p, 0.1F);
}
}
Camera.worldToCameraMatrix 世界转相机矩阵
从世界到相机空间的变换矩阵
从Offsets位置偏移相机的渲染
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Vector3 offset = new Vector3(0, 1, 0);
void LateUpdate()
{//构建一个沿着Z轴偏移和镜像的矩阵,因为相机已经为Z轴镜像,并用于其余部分
Vector3 camoffset = new Vector3(-offset.x, -offset.y, offset.z);
Matrix4x4 m = Matrix4x4.TRS(camoffset, Quaternion.identity, new Vector3(1, 1, -1));
//重载worldToCameraMatrix为偏移/镜像的变换矩阵
camera.worldToCameraMatrix = m * transform.worldToLocalMatrix;
}
}
Camera.WorldToScreenPoint 世界转屏幕位置
从世界空间到屏幕空间变换位置
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Transform target;
void Update()
{
Vector3 screenPos = camera.WorldToScreenPoint(target.position);
print("target is " + screenPos.x + " pixels from the left");
}
}
Camera.WorldToViewportPoint 世界转视窗位置
从世界空间到视窗空间的变换位置
Target在屏幕的左边还是右边
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Transform target;
void Update()
{
Vector3 viewPos = camera.WorldToViewportPoint(target.position);
//视口坐标范围从0到1
if (viewPos.x > 0.5F)
print("target is on the right side!");
else
print("target is on the left side!");
}
}
CapsuleCollider.center 中心
胶囊的中心,基于物体的自身坐标空间
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //重设中心点到变换的位置
collider.center = Vector3.zero;
}
}
CapsuleCollider.direction 方向
胶囊的方向
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //使胶囊的高度沿着x轴
collider.direction = 0;
}
}
CapsuleCollider.height 高度
胶囊的高度,基于物体的自身空间
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
collider.height = 5;
}
}
CapsuleCollider 胶囊碰撞器
一个胶囊形状的基本碰撞器
CapsuleCollider.radius 半径
球体的半径,基于物体的自身坐标
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
collider.radius = 1;
}
}
CharacterController.center 中心
相对于变换位置的角色胶囊体的中心
将胶囊体的中心向上移动
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public CharacterController controller;
public void Awake()
{
controller = GetComponent<CharacterController>();
controller.center = new Vector3(0, 1, 0);
}
}
CharacterController.collisionFlags 碰撞标识
在最后的CharacterController.Move调用期间,胶囊体的哪个部分与周围环境相碰撞
function Update () {
var controller : CharacterController = GetComponent(CharacterController);
if ((controller.collisionFlags & CollisionFlags.Above) != 0)
print("touched the ceiling");
}
CharacterController.detectCollisions 检测碰撞
其他的刚体和角色控制器是否能够与本角色控制器相碰撞(默认值始终启用)
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public CharacterController c;
public void Awake()
{
c = GetComponent<CharacterController>();
c.detectCollisions = false;
}
}
CharacterController.height 高度
角色胶囊体的高度
设置控制器的高度为2.0
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public CharacterController controller;
public void Awake()
{
controller = GetComponent();
controller.height = 2.0F;
}
}
CharacterController 角色控制器
用CharacterController组件,它包含Rigidbody组件的一些属性,就不用用Rigidbody组件了
character一般用于主角这类用户控制的物体,它不会受到scene的重力影响,不会被其他物体推。
程序中可以使用它的move方法移动它,当他碰到静态物体时,会停下来,遇到动态物体时会推开他,当然,这些都是可以通过activegroup来控制的。group最多有32组。因为他是一个NxU32,并通过每一位代表一个组。
move的一个参数用来告诉程序,character的当前状态。(collisionFlags)
当他遇到物体的时候,如果设置了回调函数,系统会通过回调函数通知程序。。(NxControllerDesc.callback)
character还有上楼梯模式,在某些高度的台阶,可以直接上去。(NxControllerDesc.stepOffset)
character还可以设置可以走上去的斜坡。(NxControllerDesc.slopeLimit)
由于character不受场景的重力影响,所以,用户要在move函数中自己添加重力因素,也就是说,character可以浮在空中,除非那里有其他activegroup物体。
CharacterController.isGrounded 是否地面
在最后的移动角色控制器是否触碰地面?
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Update()
{
CharacterController controller = GetComponent<CharacterController>();
if (controller.isGrounded)
print("We are grounded");
}
}
CharacterController.Move 移动
一个更加复杂的运动函数,每次都绝对运动
这个脚本用箭头键向前移动和侧移角色控制器。
当按下空格键时,它跳起
确保把一个character controller组件附加到同一个游戏物体上
建议你每帧只调用一次Move或者SimpleMove
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public float speed = 6.0F;
public float jumpSpeed = 8.0F;
public float gravity = 20.0F;
private Vector3 moveDirection = Vector3.zero;
void Update()
{
CharacterController controller = GetComponent<CharacterController>();
if (controller.isGrounded)
{ //我们着地了,所以直接通过轴重新计算move direction。
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton("Jump"))
moveDirection.y = jumpSpeed;
}
//应用重力
moveDirection.y -= gravity * Time.deltaTime;
//移动控制器
controller.Move(moveDirection * Time.deltaTime);
}
}
CharacterController.OnControllerColliderHit 控制碰撞器碰撞
当控制器碰撞一个正在运动的碰撞器时,OnControllerColliderHit 被调用
这个脚本推动所有的角色碰撞到的刚体
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public float pushPower = 2.0F;
void OnControllerColliderHit(ControllerColliderHit hit) {
Rigidbody body = hit.collider.attachedRigidbody;
// 没有刚体
if (body == null || body.isKinematic)
return;
// 我们不想推动在我们下边的物体
if (hit.moveDirection.y < -0.3F)
return;
// 通过移动方向计算推动方向,我们只把物体推到两侧,从不向上和向下推
Vector3 pushDir = new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);
// 如果你知道你的角色移动的有多快,那么你也可以用它乘以推动速度
// 应用推力
body.velocity = pushDir * pushPower;
}
}
CharacterController.radius 半径
角色胶囊体的半径
设置控制器的半径为0.3
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public CharacterController controller;
public void Awake()
{
controller = GetComponent<CharacterController>();
controller.radius = 0.3F;
}
}
CharacterController.SimpleMove 简单移动
以一定的速度移动角色
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public float speed = 3.0F;
public float rotateSpeed = 3.0F;
void Update()
{
CharacterController controller = GetComponent<CharacterController>();
//围绕Y轴旋转
transform.Rotate(0, Input.GetAxis("Horizontal") * rotateSpeed, 0);
//向前后移动
Vector3 forward = transform.TransformDirection(Vector3.forward);
float curSpeed = speed * Input.GetAxis("Vertical");
controller.SimpleMove(forward * curSpeed);
}
}
CharacterController.slopeLimit 坡度限制
角色控制器的坡度度数限制
设置控制器的坡度限制为45.0度
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public CharacterController controller;
public void Awake()
{
controller = GetComponent<CharacterController>();
controller.slopeLimit = 45.0F;
}
}
CharacterController.stepOffset 台阶偏移量
以米为单位的角色控制器的台阶偏移量
台阶高度,步高
设置控制器的台阶高度
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public CharacterController controller;
public void Awake()
{
controller = GetComponent();
controller.stepOffset = 2.0F;
}
}
CharacterController.velocity 速度
角色当前的相对速度
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Update() {
CharacterController controller = GetComponent<CharacterController>();
Vector3 horizontalVelocity = controller.velocity;
horizontalVelocity = new Vector3(controller.velocity.x, 0, controller.velocity.z);
//忽略Y轴的X-Z平面上的速度
float horizontalSpeed = horizontalVelocity.magnitude;
//重力或者跳跃引起的速度
float verticalSpeed = controller.velocity.y;
//总体速度
float overallSpeed = controller.velocity.magnitude;
}
}
CharacterJoint.highTwistLimit 旋转上限
角色关节围绕原始轴的上限
CharacterJoint 角色关节
角色关节主要用于布娃娃效果 它们是一个扩展的球窝状关节,允许你在每个轴上限制关节
CharacterJoint.lowTwistLimit 旋转下限
角色关节围绕原始轴的下限
CharacterJoint.swing1Limit 旋转限制1
角色关节围绕原始轴的限制
CharacterJoint.swing2Limit 旋转限制2
CharacterJoint.swingAxis 旋转轴
关节可以围绕旋转的副轴
Cloth.bendingStiffness 抗弯硬度
布料的抗弯硬度(坚挺的程度)
设置布料的bending Stiffness为1
可以是Skinned Cloth或者Interactive Cloth
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
transform.GetComponent<Cloth>().bendingStiffness = 1;
}
}
Cloth.damping 阻尼
布料运动时的阻尼
设置布料的damping为1
可以是Skinned Cloth或者Interactive
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
transform.GetComponent<Cloth>().damping = 1;
}
}
Cloth.enabled 启用?
是否启用这个布料?
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
GetComponent<InteractiveCloth>().enabled = false;
}
}
Cloth.externalAcceleration 外力
施加于布料的外力,一个恒量
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //使布料下落时,受到一半的重力(如果是受重力影响)
transform.GetComponent<Cloth>().externalAcceleration = -Physics.gravity / 2;
}
}
Cloth 布料
用来模拟物理布料的基类,通过InteractiveCloth和SkinnedCloth共享
Cloth.normals 法线列表
当前布料物体的法线列表
Cloth.randomAcceleration 随机外力
施加于布料的外力,一个随机变量
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ //模仿来自X轴向上的风
transform.GetComponent<Cloth>().randomAcceleration = new Vector3(10, 0, 0);
}
}
Cloth.selfCollision 自身碰撞
是否产生自身碰撞
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
GetComponent<InteractiveCloth>().selfCollision = false;
}
}
Cloth.stretchingStiffness 韧度
布料的韧性(可拉伸的程度)
设置布料的stretching Stiffness为1
可以是Skinned Cloth或者Interactive
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
transform.GetComponent<Cloth>().stretchingStiffness = 1;
}
}
Cloth.thickness 厚度
布料表面的厚度
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{
transform.GetComponent<Cloth>().thickness = 0.2F;
}
}
Cloth.useGravity 使用重力
是否重力影响布料模拟?
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ // 使布料不受重力的影响
transform.GetComponent<Cloth>().useGravity = false;
}
}
Cloth.vertices 顶点列表
当前布料物体的顶点位置列表
ClothRenderer 布料渲染器
ClothRenderer组件和InteractiveCloth 组件配合使用,在场景中使一个布料物体可见
ClothRenderer.pauseWhenNotVisible 不可见时暂停
在ClothRenderer不可见的时,暂停布料模拟
如果这个属性开启,布料只会在任意相机中可见时模拟。这样可改善物理模拟的性能
pauseWhenNotVisible = true;
ClothSkinningCoefficient.collisionSphereDistance 碰撞球体距离
定义一个球体的一个顶点不允许进入 这允许反向碰撞动画布料(什么意思)
ClothSkinningCoefficient.collisionSphereRadius 碰撞球体半径
定义一个球体的一个顶点不允许进入 这允许反向碰撞动画布料
ClothSkinningCoefficient 布料蒙皮系数
ClothSkinningCoefficient结构用于设置SkinnedCloth组件允许如何移动,有关SkinnedMeshRenderer是附加的(不懂)
ClothSkinningCoefficient.maxDistance 最大距离
一个点是允许从蒙皮网格点位置运动的距离
ClothSkinningCoefficient.maxDistanceBias 最大距离偏移
通过基于蒙皮网格法线的最大距离,变形定义的球体(what)
Collider.attachedRigidbody 附加刚体
碰撞器附加的刚体
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ // Lift the rigidbody attached to the collider.
//升起附加在碰撞器的刚体
collider.attachedRigidbody.AddForce(0, 100, 0);
}
}
Collider.bounds 包围盒
碰撞器在世界坐标空间的包围盒
Collider.ClosestPointOnBounds 到包围盒最近点
到附加碰撞器的包围盒最近的点
当应用于爆炸伤害,这能用于计算伤害点数
var hitPoints : float = 100.0;
function ApplyHitPoints (explosionPos : Vector3, radius : float) {
// The distance from the explosion position to the surface of the rigidbody
//从爆炸点到刚体表面的距离
var closestPoint : Vector3 = collider.ClosestPointOnBounds(explosionPos);
var distance : float = Vector3.Distance(closestPoint, explosionPos);
// The hit points we apply fall decrease with distance from the hit point
//伤害点数,我们使到伤害点距离减少
var hitPoints : float = 1.0 - Mathf.Clamp01(distance / radius);
// This is the final hitpoints we want to apply. 10 at maximum
//这是我们想要的最终伤害点数为10
hitPoints *= 10;
}
Collider 碰撞器
所有碰撞器的基类(鸡肋)
Collider.isTrigger 是触发器?
碰撞器是一个触发器?
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ // Turns the attached to collider into a trigger
//转换附加的碰撞器为一个触发器
collider.isTrigger = true;
}
}
Collider.material 材质
碰撞器使用的材质
如果材质被碰撞器共享,它将复制材质并指定给碰撞器
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ // Makes the collider act like ice.
//让碰撞器像冰一样(滑动摩擦&&静摩擦==0)
collider.material.dynamicFriction = 0;
collider.material.staticFriction = 0;
}
}
Collider.OnCollisionEnter 进入碰撞
当collider/rigidbody开始触动另一个rigidbody/collider时OnCollisionEnter被调用
如果碰撞器附加一个非动力学刚体,也仅发送碰撞事件
例一
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnCollisionEnter(Collision collision)
{ // Debug-draw all contact points and normals
//调试绘制全部的接触点和法线
foreach (ContactPoint contact in collision.contacts)
{
Debug.DrawRay(contact.point, contact.normal, Color.white);
}
// Play a sound if the coliding objects had a big impact.
//如果碰撞物体有一个更大的撞击就播放声音
if (collision.relativeVelocity.magnitude > 2)
audio.Play();
}
}
例二
一个手榴弹
A grenade
一个手榴弹
- instantiates a explosion prefab when hitting a surface
当撞击表面时实例化一个爆炸预设
- then destroys itself
然后销毁它们
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Transform explosionPrefab;
void OnCollisionEnter(Collision collision)
{ // Rotate the object so that the y-axis faces along the normal of the surface
//旋转物体,以便y轴方向沿着表面的法线
ContactPoint contact = collision.contacts[0];
Quaternion rot = Quaternion.FromToRotation(Vector3.up, contact.normal);
Vector3 pos = contact.point;
Instantiate(explosionPrefab, pos, rot);
// Destroy the projectile
//销毁炮弹
Destroy(gameObject);
}
}
Collider.OnCollisionExit 退出碰撞
当 collider/rigidbody停止触动另一个 rigidbody/collider时,OnCollisionExit被调用
如果碰撞器附加一个非动力学刚体,也仅发送碰撞事件
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnCollisionExit(Collision collisionInfo)
{
print("No longer in contact with " + collisionInfo.transform.name);
}
}
Collider.OnCollisionStay 逗留碰撞
一个碰撞器或刚体触动另一个刚体或碰撞器,在每帧都会调用OnCollisionStay,直到它们之间离开,不接触
如果碰撞器附加一个非动力学刚体,也仅发送碰撞事件
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnCollisionStay(Collision collisionInfo)
{ // Debug-draw all contact points and normals
//调试绘制全部接触点和法线
foreach (ContactPoint contact in collisionInfo.contacts)
{
Debug.DrawRay(contact.point, contact.normal * 10, Color.white);
}
}
}
Collider.OnTriggerEnter 进入触发器
当碰撞器other进入触发器时OnTriggerEnter被调用
假如一个碰撞物体同时带有一个刚体属性
那么只发送这个触发事件
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnTriggerEnter(Collider other)
{ // Destroy everything that enters the trigger
//当进入触发器销毁所有物体
Destroy(other.gameObject);
}
}
Collider.OnTriggerExit 退出触发器
当碰撞器离开触发器时,调用OnTriggerExit
假如一个碰撞物体同时带有一个刚体属性
那么只发送这个触发事件
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnTriggerExit(Collider other)
{ // Destroy everything that leaves the trigger
//离开触发器时,销毁所有物体
Destroy(other.gameObject);
}
}
Collider.OnTriggerStay 逗留触发器
每个碰撞器从进入触发器那一刻到退出触发器之前,几乎每帧都会调用OnTriggerStay
假如一个碰撞物体同时带有一个刚体属性
那么只发送这个触发事件
OnTriggerStay是在每一个Time.fixedDeltaTime的时间节点上运行,不是Time.deltaTime的时间节点上运行
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnTriggerStay(Collider other)
{ // Applies an upwards force to all rigidbodies that enter the trigger.
//进入触发器给所有的刚体应用向上的力
if (other.attachedRigidbody)
other.attachedRigidbody.AddForce(Vector3.up * 10);
}
}
Collider.Raycast 光线投射
投射一个光线(Ray),它忽略所有碰撞器,除了这个
// pragma below is needed due to a UnityJS issue
//下面的代码运行于js
#pragma strict
function Update() {
var ray : Ray = Camera.main.ScreenPointToRay (Input.mousePosition);
var hit : RaycastHit;
if (collider.Raycast (ray, hit, 100.0))
{
Debug.DrawLine (ray.origin, hit.point);
}
}
Collider.sharedMaterial 共享材质
碰撞器的共享物理材质
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public PhysicMaterial material;
public void Awake()
{
collider.sharedMaterial = material;
}
}
Collision.collider 碰撞器
我们碰撞的碰撞器
Collision.contacts 接触点列表
接触点由物理引擎产生
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnCollisionStay(Collision collision)
{ // Check if the collider we hit has a rigidbody
// Then apply the force
//检查如果碰撞的碰撞器有刚体,然后应用力
foreach (ContactPoint contact in collision.contacts)
{
print(contact.thisCollider.name + " hit " + contact.otherCollider.name);
// Visualize the contact point
//可视化接触点
Debug.DrawRay(contact.point, contact.normal, Color.white);
}
}
}
Collision.gameObject 游戏物体
gameObject是我们碰撞的物体
Collision 碰撞
描述碰撞
Collision.relativeVelocity 相对速度
两个碰撞物体的相对线性速度
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnCollisionEnter(Collision collision)
{ // Play a sound when we hit an object with a big velocity
//当以一个较大的速度碰到物体时,播放声音
if (collision.relativeVelocity.magnitude > 2)
audio.Play();
}
}
Collision.rigidbody 刚体
我们碰撞的刚体 如果我们碰撞的物体是一个没有附加刚体的碰撞器,返回null
Make all rigidbodies we touch fly upwards
使我们接触的全部刚体向上飞
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void OnCollisionStay(Collision collision)
{ // Check if the collider we hit has a rigidbody
//检查如果我们接触的碰撞器是一个刚体
if (collision.rigidbody)
// Then apply the force
//然后应用力
collision.rigidbody.AddForce(Vector3.up * 15);
}
}
Collision.transform 变换
我们碰撞的物体的Transform
Color.a 透明
颜色中的Alpha组件
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Color color = Color.white;
public void Awake()
{
color.a = 0;
}
}
Color.b 蓝色
三基色之一的蓝色通道
Color.g 绿色
三基色之一的绿色通道
Color.r 红色
三基色之一的红色通道
Color.black 黑色
纯黑色 RGBA 是 (0, 0, 0, 1)
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public void Awake()
{ // Assign a black color to this transform's material
// 赋一个黑色给这个变换的材质
transform.renderer.material.color = Color.black;
}
}
Color.blue 蓝色
纯蓝色 RGBA 是(0, 0, 1, 1)
Color.clear 清空
完全透明 RGBA 是 (0, 0, 0, 0)
Color.Color 颜色
用给定的r,g,b,a组件构造一个新的颜色
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Color color = new Color(0.2F, 0.3F, 0.4F, 0.5F);
}
Color.cyan 青色
青色 RGBA 是 (0, 1, 1, 1)
Color.gray 灰色 || Color.grey 灰色
灰色 RGBA 是 (0.5, 0.5, 0.5, 1)
Color.grayscale 灰度
颜色的灰度值
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Color color = new Color(0.3F, 0.4F, 0.6F);
public void Awake()
{
print(color.grayscale);
}
}
Color.green 绿色
纯绿色 RGBA 是 (0, 1, 0, 1)
Color.magenta 紫红色
紫红色 RGBA 是 (1, 0, 1, 1)
Color.red 红色
纯红色 RGBA 是 (1, 0, 0, 1)
Color.white 白色
纯白色 RGBA 是 (1, 1, 1, 1)
Color.yellow 黄色
黄色。 RGBA 是怪异的 (1, 235/255, 4/255, 1) , 但是颜色看起来漂亮!
Color.this [int index] 访问索引
分别用[0],[1],[2],[3]访问r,g,b,a组件
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Color p;
public void Awake()
{
p[1] = 5;
// the same as p.g = 5
// 等同于 p.g = 5
}
}
Color.Lerp 插值
通过t在颜色a和b之间插值
Converts a white color to a black one trough time.
在一个时间段内将白色逐渐转换成黑色
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Color lerpedColor = Color.white;
void Update()
{
erpedColor = Color.Lerp(Color.white, Color.black, Time.time);
}
}
Color.operator + 运算符 加法
两个颜色相加,每个组件被分别相加
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
// blue + red = magenta
//蓝色+红色=紫红色
public Color result = Color.blue + Color.red;
}
以下东西有个屁用
Color.operator Color 运算符 颜色 miss
Color.operator /运算符 除法 miss
Color.operator * 运算符 乘法 miss
Color.operator - 运算符 减法 miss
Color.operator Vector4 运算符 四维向量 miss
Color.ToString 转为字符串 miss
CombineInstance 合并实例
用来描绘网格合并的结构,使用Mesh.CombineMeshes
CombineInstance.mesh 网格
网格合并
CombineInstance.subMeshIndex 子网格索引
网格的子网格索引
CombineInstance.transform 变换
合并之前,网格变换的矩阵