unity快速上手笔记

这篇博客记录了Unity的学习笔记,涵盖了Unity的基础使用,如视图操作、Gizmos、时间管理,以及C#脚本的应用,如SetActive、Input.GetKey、Lerp等函数的使用。此外,还详细讲解了Unity的光照贴图烘培、粒子系统、摄像机跟随、碰撞检测、UI系统和音频音效的实现方法。
摘要由CSDN通过智能技术生成

unity学习笔记


Unity的简单使用

  1. Align with view:把物体移动到视图窗口位置(移动camera到scene)
  2. Move to view:把物体移动到视图中心
  3. Gizmos场景手柄工具
  4. F:在scene聚焦所选物体
  5. Snap setting:对齐设置,在edit中,按固定增量移动,按ctrl使用
  6. V:捕捉画面中物体顶点,可以用来移动物体到正确的位置
  7. 视图:x y z圆锥可以切换视图,Perspective,Iso
  8. Time.deltaTime:每秒钟基础上变换
  9. 右键:alt一样,还可以用wasd,shift可以加速。
  10. 凹凸地形:如果要凹,要先set heigh
  11. SKYBOX:创建shader选skybox,应用windows-rendering
  12. WindZone:有BendFactor的树会摇动
  13. Prefabs:从Hierarchy拖到Project编程预制件,点入预制件可以修改,在scene修改只是变化了在该scene中的状态
  14. 如果gameobjective没有set active,那么他上面挂的脚本就不能运行,他的父对象激活的也不运行。
  15. 父物体在脚本中的移动也会让他的子物体移动,但是子物体自己的脚本只让他在和父物体移动的移动的同时,又根据脚本移动;另外子物体父物体谁加重力谁有重力互不影响。

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修改字体大小刚好填充框

3 ui拖拽

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值