unity学习笔记
目录
- unity学习笔记
- Unity的简单使用
- C#脚本简单使用
- 1.SetActive
- 2.Input.GetKey
- 3.Lerp
- 4.Trigger
- 6.Key,Button
- 7.Input.GetAxis
- 8.OnMouseDown
- 9.AddForce
- 10.transform.forward
- 11.Tranform
- 12.time.deltatime
- 13.Instantiate实例化
- 14.Invoke调用
- 15.private protected public
- 16.光照贴图烘培
- 17.粒子系统 火焰
- 18.animation animator
- 19.摄像机跟随
- 20.collision SendMessage
- 21.SpriteRenderer
- 22.Random.Range
- 23.SetParent parent
- 24.引用UI
- 25.SceneManagement;
- 26.Audio 音效
- 27.Shader 着色器
- 28.UI
Unity的简单使用
- Align with view:把物体移动到视图窗口位置(移动camera到scene)
- Move to view:把物体移动到视图中心
- Gizmos场景手柄工具
- F:在scene聚焦所选物体
- Snap setting:对齐设置,在edit中,按固定增量移动,按ctrl使用
- V:捕捉画面中物体顶点,可以用来移动物体到正确的位置
- 视图:x y z圆锥可以切换视图,Perspective,Iso
- Time.deltaTime:每秒钟基础上变换
- 右键:alt一样,还可以用wasd,shift可以加速。
- 凹凸地形:如果要凹,要先set heigh
- SKYBOX:创建shader选skybox,应用windows-rendering
- WindZone:有BendFactor的树会摇动
- Prefabs:从Hierarchy拖到Project编程预制件,点入预制件可以修改,在scene修改只是变化了在该scene中的状态
- 如果gameobjective没有set active,那么他上面挂的脚本就不能运行,他的父对象激活的也不运行。
- 父物体在脚本中的移动也会让他的子物体移动,但是子物体自己的脚本只让他在和父物体移动的移动的同时,又根据脚本移动;另外子物体父物体谁加重力谁有重力互不影响。
C#脚本简单使用
Awake:最先调用,即使脚本component没有打勾
Start:脚本component打勾后才调用
Update:用于非物理运动
Fixedupdate:每固定时间调用一次,用于物理运动,在edit-projectsetting-time中修改
Public变量可以在unity窗口出现
public MeshRenderer Mmesh;可以得到MeshRender变量
bool one=true;
脚本中直接用gameObject算 本物体
用左手三个指头,大拇指x,食指y,中指z,作为坐标系。
1.SetActive
代码如下(示例):
gameObject.SetActive(false);//把本物体激活
public GameObject myObject;//把脚本放在一直激活的物体上才可以激活脚本
myObject.SetActive(true);//把myObject激活
Debug.Log("Active self: "+myObject.activeSelf);//检查物体是否被激活
Debug.Log("Active in hierarchy : " + myObject.activeInHierarchy);//检查父物体是否被激活·
2.Input.GetKey
代码如下(示例):
if (Input.GetKey(KeyCode.RightArrow))
transform.Rotate(Vector3.down * 50* Time.deltaTime);//旋转时所选的轴是围绕它旋转,按照自己的坐标系而不是世界坐标系
3.Lerp
代码如下(示例):
float result = Mathf.Lerp(3, 5, 0.5f);//线性插值函数
Vector3 result = Vector3.Lerp(Vector3.right, new Vector3(3, 3, 3), 0.5f);//结果是(2,1.5,1.5);
其中Vector3.right是单位向量Vector3.zero是零向量
4.Trigger
是触发器(被撞的),不会被别的rigidbidy碰到的,此时才可用onTriggerEnter(),它不用加rigidbidy。 当两个Collider其中有一个是触发器,就可以用onTriggerEnter()//在哪个脚本上都可以 来撞的要加rigidbidy,有没有重力都可以 is kinematic使用数学模型而不用物理撞击,只检测碰撞,动起来用transform。 Rigidbody的Drag是空气阻力。 ```c onTriggerEnter()// ``` ## 5.Destroy销毁物体,代码如下(示例):
if (Input.GetKey(KeyCode.Space))
Destroy(gameObject);
Destroy(gameObject,3f);
Destroy(Other.GetComponent<MeshRenderer>(),3f);//延时3秒销毁物体或者component。
6.Key,Button
代码如下(示例):
//Button
bool down = Input.GetButtonDown("Jump");//按下那一刻是true
bool hold = Input.GetButton("Jump");//一直在下边是true
bool up = Input.GetButtonUp("Jump");//拿开手那一刻是true
Debug.Log("down"+down);
Debug.Log("hold"+hold);
Debug.Log(("up")+up);
if (Input.GetButtonUp("Jump"))//按下松手那一刻激活,也就是up
//Key
bool down = Input.GetKeyDown(KeyCode.Space);
bool hold = Input.GetKey(KeyCode.Space);
bool up = Input.GetKeyUp(KeyCode.Space);
if (Input.GetKey(KeyCode.Space))//按下去的时间调用,也就是hold为true调用,按下去的每一帧都调用
{
Debug.Log("hold" + hold);
transform.Translate(new Vector3(1,1,1));
}
7.Input.GetAxis
GetAxis轴;Horizontal水平轴;v…垂直轴;取值范围-1到1。
float translation = Input.GetAxis("Horizontal") * 1.0f;//按下水平轴的ad或者左右,返回浮点数
transform.Translate(0, 0, translation*Time.deltaTime);
Debug.Log(translation);
8.OnMouseDown
代码如下(示例):
void OnMouseDown()//被点击的物体必须有Collider;
{
Debug.Log("点到");
}
9.AddForce
代码如下(示例):
void OnMouseDown()
{
MyObject. GetComponent<Rigidbody>().AddForce(transform.forward * 500f);//自己坐标
MyObject.GetComponent<Rigidbody>().useGravity = true;//按过一次后就一直是true
MyObject.GetComponent<Rigidbody>().AddForce(Vector3.back*500f);//世界坐标
MyObject.GetComponent<Rigidbody>().AddForce(Vector3.up*20f,ForceMode.Acceleration);
MyObject.GetComponent<Rigidbody>().AddForce(0,200,0);//世界坐标
10.transform.forward
代码如下(示例):
print (transform.forward);//(0,0,1)
transform.forward = new Vector3(0, 2, 0);//其实是把物体绕着x轴旋转了
print(transform.forward);//(0,1,0)
transform.Translate(transform.up * Time.deltaTime * moveSpeed, Space.World);
// transform.up这个值是会随着物体的旋转改变的,当旋转为0时就是物体当前方向
//这个是特殊如果用transform.up移动,必须要Space.World
11.Tranform
代码如下(示例):
transform.Translate (new Vector3(0, 2, 0));//按照这个方向每帧都移动2
transform.Translate (new Vector3(0, 2*Time.deltaTime, 0));//按照这个方向每秒移动2
transform.position = new Vector3(0, 2, 0);//只是把位置变了,调用几次都一样
transform.position +=new Vector3 (2*Time.deltaTime, 0, 0);// 按照这个方向每秒移动2
//而rotation是四元的
//gameObject.transform.eulerAngles是vector3类型的(等于rotaion那一栏的数值)
//Quaternion.Euler(transform.eulerAngles)变成四元的
print(new Vector3(0, 5, 10) + new Vector3(1, 5, 0));//vector3类型的可以相加
Quaternion.Euler(bullectA+transform.eulerAngles )//是四元的
12.time.deltatime
代码如下(示例):
void OnMouseDown()
{
count -= Time.deltaTime;//count秒后灯亮
if (count<=0.0f)
GetComponent<Light>() .enabled= true;
DefendTimeVar=3;
DefendTimeVar -= Time.deltaTime;
if (DefendTimeVar<=0);
13.Instantiate实例化
代码如下(示例):
void OnMouseDown()
{
if (Input.GetButtonDown("Jump"))
Instantiate(otherObject);
//如果otherObject是本gameobject,那么每个分裂出来的都会再次克隆,否则只有一个会克隆
public Transform barrel;//berral可以是一个空物体
Instantiate(myObject,barrel.position,barrel.rotation);// transform.rotation = 四元数身份;设置初始速度
Rigidbody clone;
clone=Instantiate(myObject, barrel.position, Quaternion.identity);//默认(0,0,0,1)
clone.AddForce(barrel.forward* 500);
clone.velocity = transform.TransformDirection(Vector3.forward * 10);
//事实证明这个函数应该挂在与要实例化不一个物体上
14.Invoke调用
代码如下(示例):
Invoke("Spawn", 2);//在start函数中,2秒之后调用
void Spawn()//自己定义
{
Instantiate(target, new Vector3(3, 5, 3), Quaternion.identity);//同上如果target在本物体上隔2秒调用一次,其他物体上只产生一个。
print(Quaternion.identity);
}
InvokeRepeating("Spawn", 4, 1);//重复调用,第一次调用4s后,之后1s调用一次
void Spawn()
{
float x = Random.Range(-5f, 5f);//这样才能有小数
float z = Random.Range(-5, 5);//产生的只有整数
Instantiate(target, new Vector3(x, 5, z), Quaternion.identity);
print(new Vector3(x, 5, z));
}
InvokeRepeating("Spawn", 0.1f, 1);
CancelInvoke("Spawn");//取消引用,如果都在start中,先走完再取消
System.Threading.Thread.Sleep(2000); //2秒后继续执行
15.private protected public
Private和protect外部类都没办法访问,但是如果有派生类 派生可以访问基类的protect,不可以访问private。使用public定义的变量可以在外边界面显示并更改16.光照贴图烘培
灯光的mode改成baked,然后window-lighe setting//无阴影
灯光的mode选择mixed再选shadows去烘培就有shadow//实时阴影
17.粒子系统 火焰
新建Effect-Particle system
Render里加贴图
Animate把4x4图片变成动画
Emission选择一次放几个
Size over lifetime可以随时间变小
18.animation animator
选择有动画的物体,点击windows-animation出现窗口 Add property可以修改一个属性得到动画 物体的animator组件的controller可以拖入animator Animator打开编辑动画块,里边可以加入animation ```c public Animator anim; anim.SetFloat("speed",(h*h+v*v)/2); ```19.摄像机跟随
20.collision SendMessage
代码如下(示例):
public Collider2D Cd;//有碰撞组件的物体
private void OnTriggerEnter2D(Collider2D collision)//碰到了一个有碰撞器的物体叫collision
switch (collision.tag)//碰到的物体的标签
case "Tank":
collision.SendMessage("Die");//在collsion物体的脚本中触发Die方法
break;
Destroy(collision);//销毁碰撞到的物体的碰撞器组件
Destroy(collision.gameObject);//销毁碰到的物体
21.SpriteRenderer
代码如下(示例):
private SpriteRenderer sr;
public Sprite BrokenHeart;
sr = GetComponent<SpriteRenderer>();
22.Random.Range
代码如下(示例):
int num = Random.Range(0, 2);//取0,1不取最后一个
private Vector3 CreatRandomPosition()//生成随机位置
{
//不生成x=10.-10;y=8.-8
while (true)
{
Vector3 CreatPosition = new Vector3(Random.Range(-9, 10), Random.Range(-7, 8), 0);
if (!hasThePosition(CreatPosition ))
{
return CreatPosition;
}
}
}
23.SetParent parent
代码如下(示例):
private void Creat(GameObject CreatGameObject,Vector3 CreatPosition,Quaternion CreatRotation)
GameObject itemGo = Instantiate(CreatGameObject, CreatPosition, CreatRotation);
itemGo.transform.SetParent(gameObject.transform);//把物体放在某父物体下
itemPositionList.Add(CreatPosition);//把creatposition放到Vector3的列表里
Newsweet.transform.parent = transform;
24.引用UI
代码如下(示例):
using UnityEngine.UI;
public Text textPlayerScore;
public Text textLifeValue;//text用text
public GameObject isDefeatUI;//图片用gameobject;
//UI自适应
//UI会出现一个canvas,点击canvas scaler的Ui scale mode选择scale with sceen
25.SceneManagement;
这个函数用来改变场景
using UnityEngine.SceneManagement;
if(choice==1&& Input.GetKeyDown(KeyCode.Space))
{
SceneManager.LoadScene("Game");//game是场景的名字
}
//要把场景添加到building settings里
//或者
SceneManager.LoadScene(0);
26.Audio 音效
代码如下(示例):
public AudioClip dieAudio;
AudioSource.PlayClipAtPoint(dieAudio, transform.position);
//直接在物体上添加AudioSource组件
public AudioSource moveAudio;//组件拖进去
public AudioClip[] tankAudio;//音频资源
moveAudio.clip = tankAudio[1];//组件中的声音改变
if (!moveAudio.isPlaying)//如果没有在播放
moveAudio.Play();
GetComponent<AudioSource>().clip = moveAudio.clip//可以代换
27.Shader 着色器
Shader "TA/MyUnlitShader"在材质球的shader面板
1 Properties
定义属性,材质球面板中显示的贴图和一些参数包括如何实现滑杆、开关、下拉选择框等
材质面板上需要设置的内容都必须通过Properties来实现并暴露。
2 subshaders
当前Shader的核心算法实现就是在SubShader中来实现的。
在加载Shader时,Unity将遍历所有SubShader列表,并最终选择用户机器支持的第一个。所以subshader不唯一
3 fallback 备胎
Shader在一些机器上会出现不支持的问题(最终呈现的就是显示成粉红色),而这个时候我们只要添加了FallBack,并且在后面的双引号内写上了其它Shader的有效路径名称,那么在碰到不支持的硬件时这个Shader就会自动切换成FallBack内的Shader
4 CustomEditor 自定义界面
自定义界面,也就是说我们可以通过这个功能来自由定义材质面板的显示结果,它可以改写Properties中定义的显示方式。
28.UI
1 Canvas
UI的图片只会在Canvas下才能看得见UI图片都会在这下面渲染
EventSystem:UI的事件系统
UI的层级和在canvas里物体的上下关系的一样
2 rect transform
Anchors:锚点位置屏幕自适应部分
Pivot:中心点,定义图片的中心点位置,(0.5,0.5)刚好为图片中心。
Image-RaycastTarget: 勾选该选项后,该UI将会响应射线点击,鼠标点击到这个UI物体的时候事件管理器知道我们点击了什么物体,这个参数会和Button组件配合,完成我们的点击操作。
Text-bestfit修改字体大小刚好填充框