Unity学习心得

来源:互联网 发布:js新建数组对象 编辑:程序博客网 时间:2024/06/07 04:52

Unity学习心得

第一个项目 Roll A Ball

1.基本模型和场景操作

双击Cube,表示聚焦(在Scene场景中)或者按下 F键

Persp:透视视图 (会产生近大远小) ISO:平行视野(不会产生近大远小的效果)


2.世界坐标系和局部坐标系:

世界坐标:以世界原点为中心的坐标 局部坐标:以父节点的中心为原点的坐标


3.对物体常用操作移动缩放旋转:

默认单位:m 快捷键集合:QWER
红色轴:x轴 蓝色轴:z轴 绿色轴:y轴


4.修改游戏物体的名字:

选中游戏物体,按下F2键


5.给地面赋予材质:

project面板中创建Material文件夹———->右键create Material———–>Albedle(修改材质球的颜色)


6.给小球添加刚体组件:Rigidbody (使游戏物体拥有物理效果)


7.声明一个指向Rigidbody组件的变量:

private  Rigidbody rd;      rd = GetComponent<Rigidbody>();

8.如何使小球运动起来:

rd.AddForce(new Vector3(x,y,z));

x,y,z的正负——->力的方向
x,y,z的大小————->力的大小


9.通过按键来控制小球:

[左右移动]:
获取用户水平轴的输入:

        float h = Input.GetAxis("Horizontal");按下A键:h=-1;                 按下D键:h=1;

[前后移动]:

    float v = Input.GetAxis("Vertical");

按下S键:h=-1; 按下W键:h=1;


10.如何控制施加力的大小:

定义一个 force:

    public int force;     rd.AddForce(new Vector3(h,0,v)*force);

11.相机的跟随:

(1).将相机拖拽至目标物体下,作为其子物体。
(2).通过脚本FollowTarget

FollowTarget脚本:

a.创建跟随目标的tranform组件(获取目标的坐标):
     public Transform TargetTransform;

b.计算相机与跟随目标的偏移:
offest = transform.position - TargetTransform.position;
c.保持相机和跟随目标的偏移(offset)不变:
transform.position = TargetTransform.position + offset;

12.预制体:

相当于一个模板,修改其参数,场景中所有由它复制的物体相应的参数均会改变

13.控制食物旋转:

在预制体上添加脚本:PickUp:

void Update (){        transform.Rotate(new Vector3(1,0,0));}

14.碰撞检测:

onCollisionEnter: 碰撞发生时(仅发生一次)
onCollisionExit: 碰撞结束后(仅发生一次)
onCollisionStay: 两个物体挨在一起(触发多次)

void OnCollisionEnter(Collision collision)  //collision表示碰撞到的物体{    //获取碰撞到物体的名字    string name=collision.collider.name; //collision.collider表示获取碰撞到物体的碰撞组件    print(name);//控制台的输出}

如何获取到碰撞到的游戏物体对象:

collision.collider.gameObject

销毁碰撞到的游戏物体:

Destroy(collision.collider.gameObject);

出现的问题:两个物体碰撞时,会发生轻微反弹(即物理效果)

如何解决:将]碰撞器改为触发器:
Box Collider:勾上Is Trigger

void OnTriggerEnter(Collider collider){    if (collider.tag == "PickUp")        {          Destroy(collider.gameObject);        }}

15.分数的统计:

定义存储分数的变量score:

private int score=0;

右键 create UI——>text
白色线框代表整个屏幕范围

定义Text 组件:

public Text  text;

更新分数:

text.text = score.ToString();

在Hierarchy面板中,选中Text 按住Alt键,可以等比例放大缩小text

胜利文本的显示:在代码中激活文本物体:

//创建”胜利文本对象“   public  GameObject  winText;  //激活文本对象: 

16.总结:

如果在脚本中要控制一个游戏物体:
则定义一个该物体类型:

pulbic  GameObject   gameobject

如果在脚本中要操作(修改)某个游戏物体的某个组件:则定义为:
public 组件类型(如 Transform ,Text, Rigidbody等) xxx

17.游戏的发布:

buildsetting——->将所有场景拖至buildsetting中——–>pc版本,单击switch platform———->选86位或64位———->build——–.>命名

第二个项目 我的世界(Minercraft)

1.按住Ctrl键可以一个单位移动游戏物体

2.创建角色控制器:

unity标准资源中,FPSController/RigidBodyFPSController

3.给物体添加透明材质:

在给物体添加一张Grass001的贴图后,Grass001:shader—->Mobile——–>Particles——–>Multiply

4.控制我的世界中日夜的旋转:

(Direction Light 和场景中的太阳旋转是一样的)

获取系统的时间间隔:

Time.deltaTime

5.物体围绕自身向上旋转:

transform.Rotate(Vector3.up*rotateSpeed*Time.deltaTime,Space.Self);

6.判断场景中某个游戏物体是否激活:

if (bodyInventory.activeInHierarchy == true)

7.判断游戏物体上某个组件是否被激活:

isActiveAndEnable


第三个项目:如何制作塔防游戏(TowerDefenseProject)

1.如何让一个游戏物体与预制体解除关联:GameObject————–>Break Prefabs Instance


2.控制相机视野的移动放大和缩小:

float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical"); //获取鼠标滚轮的输入值    float mouse = Input.GetAxis("Mouse ScrollWheel");    transform.Translate(new Vector3(-h*speed, mouse*mouseSpeed, -v*speed) * Time.deltaTime, Space.World);

3.如何获取一个游戏物体下的所有子物体:

例:敌人路径的管理:

public static Transform[] positions;void Awake(){    positions = new Transform[transform.childCount];    for (int i = 0; i < positions.Length; i++)    {        positions[i] = transform.GetChild(i);    }}

4.启动一个协程:

StartCoroutine();

5.Input.GetMouseButtonDown(value)

在Update()中调用这个方法,此后每一帧重置状态时,它将不会返回true,除非用户释放这个鼠标按钮然后重新按下它,
value=0 对应左键,
value=1 对应右键,
value=2 对应中键。

6.射线检测:

//返回一条经过摄像机和指定点的射线Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit;     bool isCollider = Physics.Raycast(ray, out hit, 1000, LayerMask.GetMask("MapCub"));

ray 射线的起点和方向
hit 包含碰撞到物体的信息
distance 射线的长度
layermask 投射射线,选择投射层的蒙版
Returns 返回值 当光线投射与任何碰撞器交叉时为真,否则为假。


7.为了在unity面板中隐藏某个属性,在脚本中可以用 [HideInInspector]来修饰,

例如:

  [HideInInspector]  public GameObject turretGo;

8.触发检测:

 //进入触发器void OnTriggerEnter(Collider col){      enemys.Add(col.gameObject);}//离开触发器 void OnTriggerExit(Collider col){     enemys.Remove(col.gameObject);}

9.让游戏暂一段时间:

yield return new WaitForSeconds(time)yield return new WaitForSeconds(0.8f);

10.使某个物体旋转“望”向运动的物体:

head.LookAt(targetPosition);

11.定义一个协程:

IEnumerator SpawnEnemy()//开始执行协程    coroutine=StartCoroutine(SpawnEnemy());//停止执行协程    StopCoroutine(coroutine);

11.协程的三大要点:

1.返回值是IEnumerator
2.返回参数时 ,使用:yeild return null/0;
3.调用时,StartCoroutine(method());

12.“重玩”和“菜单”按钮的设定

 //“Again”和”Menu“按钮public void ButtonRetry(){                   SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);}public void ButtonMenu(){    SceneManager.LoadScene(0);}

13.“开始游戏”和“退出”按钮:

  public void OnStartGame()  {    SceneManager.LoadScene(1);  }  public void OnExitGame()  {    Application.Quit();  }

Unity进阶

特效组件

1.TrialRenderer(拖尾渲染组件)

如何创建?

(1).新建一个空的游戏物体
(2).给这个物体添加TrialRenderer组件

制作透明材质球

(1)创建一个材质球
(2)设置该材质球的Shader为Particles/Additive;(粒子/添加物)
(3)给材质球拖拽赋予贴图

TrialRenderer常用属性

(1).Time 设置拖尾特效的持续时间
(2).Start Width 设置拖尾开始时的宽度

LineRenderer 线渲染器

常用属性:
Position: 设置线开始点和结束点的位置

声音组件

1.AudioSource
AudioClip 音频剪辑
常用属性:

Play On Awake(唤醒时开始播放)
勾选之后,在游戏运行起来之后,就会开始播放

Mute(静音)
Spatial Blend(空间混合)

设置声音是2D还是3D声音,为0时,2D,为1时 3D。


2.AudioListener组件 (声音侦听器)

默认状态下,它是挂在摄像机上的

AudioSource常用函数
play();
stop();
pause();


3.常用API之实例化和销毁
实例化
    GameObject.instantate(Object,Vector3,Quaternion)

Object: 用于实例化的预制体
Vector3: 实例化后生成物体所在的位置
Quaternion[四元素]: 实例化后生成物体的旋转状态
Quaternion.identity:无旋转

4.构造随机位置:
//生成随机数Random.Range(min,max);
5.销毁
//定时销毁某个游戏物体GameObject.Destroy(Object,float);  定时销毁某个游戏物体

Object:要销毁的游戏物体
float:多少秒后销毁

6.Invoke()函数

Invoke(String,float) 多少秒后执行某个函数,只会调用一次
String:要执行函数的名称
float:倒计时的时间

7.InvokeRepeating(String,float,float)

String:要执行函数的名称
float:准备时间,预备时间
float:重复要调用的时间间隔

CancelInvoke() 取消这个脚本中的所有Invoke()调用

8.主角基本控制
(1).添加刚体组件,使用刚体的MovePosition结合按键控制主角移动
 private Rigidbody player; private Transform transform;void Start (){    player = GetComponent<Rigidbody>();    transform = GetComponent<Transform>();}void Update () {    if (Input.GetKey(KeyCode.W))    {        player.MovePosition(transform.position+Vector3.forward*0.2f);    }    if (Input.GetKey(KeyCode.S))    {        player.MovePosition(transform.position + Vector3.back * 0.2f);    }    if (Input.GetKey(KeyCode.A))    {        player.MovePosition(transform.position + Vector3.left * 0.2f);    }    if (Input.GetKey(KeyCode.D))    {        player.MovePosition(transform.position + Vector3.right * 0.2f);    }}void OnCollisionEnter(Collision coll){    if (coll.gameObject.tag == "Box")    {        Destroy(coll.gameObject);    }}
9.消息发送

SendMessage(String)
String: 要发送消息的方法


10.协同程序

协同程序的使用前提:只有在继承了“MonoBehaviour”这个类的子类中才能使用相关的协程方法。

IEnumerator  Task3(){yeild return new WaitforSeconds(2);Debug.Log("任务3");}

参数说明:
IEnumerator: 协同程序的返回值类型;
yeild Return : 协同程序返回xxx
new WaitforSeconds(s):实例化一个对象,等待多少秒后继续执行


11.脚本的生命周期
1.Awake() 唤醒事件, 只执行一次。
2.OnEnable() 启用事件,只执行一次。当脚本组件被启用的时候执行一次。
3.Start()
4.FixedUpdate()

固定更新事件,执行N次,0.02秒执行一次,

5.Update()

更新事件,执行N次,每帧执行一次

6.LateUpdate()
7.OnDestroy()

销毁事件,执行一次。当脚本所挂载的游戏物体被销毁时执行。


12.常用类
Screen类

Screen.height 只读属性,屏幕的高度
Screen.width 只读属性,屏幕的宽度

Time类

常用属性:
Time.time 静态只读属性,从游戏开始到现在所经过的秒数

Time.delta time 静态只读属性,时间增量

Mathf数学类

常用函数
Mathf.Abs()
Mathf.Max()
Mathf.Min()
Mathf.Round()

插值运算函数

Mathf.Lerp(float a,float b,float t):插值运算
基于浮点数t返回a到b之间的插值,t限制在0~1之间。
当t=0时,返回a,当t=1时,返回b.
当t=0.5,返回a和b之间的平均值


13.物理射线
创建方法:

通过摄像机创建
Camer.main 代表tag设置为”MainCamera”的摄像机的Camera组件的引用
Input.mousePosition 鼠标所在的位置值

Ray 射线,结构体
//返回的是一个Ray类型的射线Camera.main.    ScreenPointToRay(Vector3);
检查射线与其它物体的碰撞

RayCastHit 一个结构体,用于射线的碰撞信息。
RayCastHit.point 获取射线碰撞点

Physics.Raycast(Ray,out RaycastHit) 静态方法Raycast(),射线检查

检查这根射线,如果射线与场景中的物理碰撞了,返回值为空,并且将碰撞的信息存储到RaycastHit类型的变量中。


Vector3向量计算方向

向量A-向量B=一个从B点到A点的方向

Debug 绘制射线(只能在scene窗口中看到)
Debug.DrawRay(Vector3,Vector3,Color): 绘制射线

第一个Vector3:起点的位置
第二个Vector3: 终点减去起点得到的一个方向
Color: 射线显示的颜色

Debug.DrawLine(Vector3,Vector3,Color); 绘制线
Vector3: 绘制线的起始位置
Vector3: 绘制线的结束位置
Color: 绘制线显示的颜色


Transform.FindChild(string): 在当前物体的子物体中查找游戏物体

Transform.parent 属性 当前物体的父物体

GetComponentsInChildren() 获取所有子物体的某个组件、

GameObject.AddComponent() 给游戏物体添加组件

transform.SetParent(Transform) 将当前物体设置为另一个物体的子物体

游戏管理器框架编写

(1)创建当前游戏状态枚举,当前游戏只有三种状态:开始,游戏中,结束
(2)查找获取三组UI的引用,并控制它们的显示次序
(3)定义一个字段存储当前的游戏状态
(4)定义一个切换游戏状态的方法
(5)通过背景声音和UI显示状态切换的效果

原创粉丝点击