Unity3D 学习笔记

Unity3D 11/21/2017

重新入门,又开始学 Unity3D。

教程: 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}}

Recent Articles

Recent Comments

{{comment.name}}{{comment.time | fDate}}

{{comment.content}}