教程: https://unity3d.com/cn/learn/tutorials
拓展编辑器相关的小技巧
在Unity中拓展编辑器,往往需要用到C#的各种特性(attribute)。 例如,我们可以使用[RangeAttribute]在Inspector视窗上显示一个滑动条。
[Range(0, 10)]
public int publicInt;
我们嫌Inspector视窗上显示的各个字段太混乱没有章法,那么我们可以使用另外两个特性来帮助我们对显示在Inspector上的字段进行整理:[SpaceAttribute]和[HeaderAttribute]。
#region 字段
[Header("测试数据1")]
[Range(0, 10)]
public int publicInt;
public bool publicBool;
public float publicFloat;
public GameObject publicObj;
[Header("测试数据2")]
[Space(10)]
public List<GameObject> objsArray;
既想保证类的某个字段不被其他的类访问修改,又想在Inspector视窗中修改这个字段的值的话,就可以采用private +[SerializeField]属性的方案。
[SerializeField]
private int privateInt;
方向键或摇杆
上下左右或adsw键盘控制时,自带渐进,可以在项目设置中进行修改。如果不需要渐进,用函数GetAxisRaw即可。
float deltaX = Input.GetAxis( "Horizontal" );// 值在 -1~+1范围
float deltaY = Input.GetAxis( "Vertical" );
按键检测
Input.GetKeyDown(KeyCode.DownArrow) //检测按键是否被按下,并在被释放前仅运行一次
Input.GetKey(KeyCode.DownArrow) // 是否按住了某个键
Input.GetMouseButtonDown(0) // 鼠标左键是否按下
Input.touchCount // 触摸屏有几个指头(触点)
Input.touches [0].phase == TouchPhase.Began // 第一个触点开始接触
unity shader
在unity中,可以使用GLSL编写shader,也可以用cg/hlsl来写。
Shader "Custom/WindowCoordinates/Base" // shader的名称
{
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
m_Emission ("Emission", Range(0,1)) = 0.0 // 定义一个参数
}
SubShader { // 一个shader中包含多个 subShader,由gpu选择执行其中一个
Pass { // shader中可以有多个pass,都会执行
CGPROGRAM // 以下为 cg代码,直到 ENDCG 结束
// 也可以写 glsl,GLSLPROGRAM,直到 ENDGLSL 结束
#pragma vertex vert // 指定顶点着色函数
#pragma fragment frag // 指定片段着色函数
#pragma target 3.0 //
#include "UnityCG.cginc"
uniform sampler2D _MainTex; // 参数需要在这里实现
float m_Emission;
struct vertexInput {
float4 vertex : POSITION;
float4 texcoord0 : TEXCOORD0;
};
struct fragmentInput{
float4 position : SV_POSITION;
float4 texcoord0 : TEXCOORD0;
};
fragmentInput vert(vertexInput i){
fragmentInput o;
o.position = mul (UNITY_MATRIX_MVP, i.vertex);
o.texcoord0 = i.texcoord0;
return o;
}
fixed4 frag(fragmentInput i) : SV_Target {
return tex2D(_MainTex, i.texcoord0.xy) * m_Emission;
}
ENDCG
}
}
FallBack "Diffuse" // 在以上 subShader 都无法执行或不符合条件时,执行回滚中的 shader
}
着色器程序中内置的状态变量
内置矩阵
支持的矩阵(float4x4):
UNITY_MATRIX_MVP 当前模型视图投影矩阵
UNITY_MATRIX_MV 当前模型视图矩阵
UNITY_MATRIX_V 当前视图矩阵。
UNITY_MATRIX_P 目前的投影矩阵
UNITY_MATRIX_VP 当前视图*投影矩阵
UNITY_MATRIX_T_MV 移调模型视图矩阵
UNITY_MATRIX_IT_MV 模型视图矩阵的逆转
UNITY_MATRIX_TEXTURE0 UNITY_MATRIX_TEXTURE3 纹理变换矩阵
内置载体
Vectors (float4) supported:
向量(仅float4)支持:
UNITY_LIGHTMODEL_AMBIENT 当前环境的颜色
代码实例
public class cubeAniController : MonoBehaviour {
private Animator m_Anim; // 动画控制器
private Renderer m_Render; // 渲染器
// Use this for initialization
void Start () {
m_Anim = GetComponent<Animator> (); // 获取该对象的组件
// 获取子物体的组件
GameObject cube1 = GameObject.Find ("Cube.001");
if(cube1)
m_Render = cube1.GetComponent<Renderer> ();
}
// Update is called once per frame
void Update () {
// 动画状态
AnimatorStateInfo state = m_Anim.GetCurrentAnimatorStateInfo (0);
// 判断当前动画,在 Animation Controller 中定义
if (state.IsName ("Rotation")) {
// 提交材质的 shader 参数
m_Render.material.SetFloat ("m_Emission", Mathf.Clamp( state.normalizedTime, 0.0f, 1.0f));
}
if (Input.GetKeyDown (KeyCode.Space))
m_Anim.Play ("Rotation"); // 播放指定的动画片段
}
}
奇怪的问题
transform.rotation.SetLookRotation(vector); //是无效的,必须赋值才生效
Quaternion quat = Quaternion.identity;
quat.SetLookRotation(vector);
transform.rotation = quat;
{{comment.name}}{{comment.time | fDateTime}}
{{reply.name}}{{reply.time | fDateTime}}