当前位置:   article > 正文

Unity 3d入门实践笔记_unity linerender删除所有点

unity linerender删除所有点

导语
由于课设的原因,这个寒假和隔壁班三个同学一起做小游戏,师兄介绍了这款引擎。本人负责怪物的属性设定、行为逻辑和相关接口的构建。总共5天时间,边学边做,引擎和C#都是从未接触过的。目前熟悉了搭建游戏比较基础的知识,过程中也遇到了一些比较迷的问题。在此做一下记录和总结。

界面

Hierarchy面板

1   父子物体                    管理多个子物体,改变物体操作的中心点/pivot的位置
    ————————————————————————————————————————————————————————
2   预制体     Prefab      预先加入的物体,预备之后重复使用
    与非预制体的差别
                        预制体     非预制体
        物体颜色            蓝色        白色
        Inspector颜色     三面蓝色    红绿蓝
    Inspector控制板
        Apply   改变一个模型  其他可以一起改变
        Select  点击以后    快速在文件夹中做出定位
        Revert  
    修改
        删除添加    部分脱离预制体关系   Apply   重新回归预制体关系
    ————————————————————————————————————————————————————————
3   摄像机     Camera      展示当前视角
    控制
        Hierarchy   出现Scene预览
        GameObject  Align With View快速定位当前摄像机的观察角度
    属性
        1Clear Flags清楚标记
            SkyBox  天空背景
            Solid Color 纯色背景
        2BackGround背景
            SolidColor  调整背景纯颜色
        3Projection投影
            Perspective     透视模式。近大远小
            Orthographic    正交模式。适合2D,远近一样大
        4Clipping Planes切割面,设置摄像机观察范围
            Near    相对于相机的近平面
            Far 相对于相机的远平面
    ————————————————————————————————————————————————————————
4   灯光      Light   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

Project面板

|----Assets:资源文件夹,保存游戏中所有的资源。
            | Assets中的资源类型 | 含义 |
            | Prefabs | 预制体 |
            | Scenes | 场景 |
            | Textures | 贴图 |
            | Scripts | 脚本 |
            | Resources | 资源 |
|----Library:库文件夹,保存当前项目需要的库文件。
|----ProjectSettings:项目设置文件夹,保存项目的设置信息。
|----Temp:临时文件夹,保存项目的临时数据。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

物体组件gameObject.GetComponent();

Transform可穿透一切物体

属性
    position    位置
函数
    Translate(Vector3,Space)                
    Rotate(Vector3,float)   
    GetComponent<T>()   有许多中,如果是components的话就便利获得即可
    AddComponent<T>()   
    SetParent(Transform)    给物体设置一个父物体
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

RigidBody刚体有重力

属性
    Mass    质量  单位KG
    Drag    阻力  单位N
    Angular Drag    角阻力 扭矩力的空气阻力,越小阻力越小,越会转
    Use Gravity 是否使用重力  
    Is Kinematic    运动学上的   保持个体平衡
函数
    MovePosition([CurrentPosition]+Vector3);
    AddForce
        作用  给刚体添加一个力,让刚体按“世界坐标系”来进行运动
        代码  Rigidbody.AddForce(Vector3, ForceMode);
        参数  力的方向和大小
        ForceMode   
            Acceleration加速度
            Force正常的物理力
            Impulse冲击力,瞬间发生
            VelocityForce带有速度的力
    AddRelativeForce
        作用  给刚体添加力,刚体按“自身坐标系”来进行运动
        代码  Rigidbody.AddRelativeForce(Vector3,ForceMode);
        参数  力的方向和大小
        问题  若球体在Update中使用此方法,可能存在来回摆动的现象??因为方向随着旋转变化
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

Colider碰撞体

碰撞时
    What    当一个用刚体控制的物体与另一物体碰撞时,出发的事件
    How     目标物体必须带有Collider组件。碰撞Collision
函数
    void函数  OnCollisionEnter(Collision) 当碰撞开始时调用    
    void函数  OnCollisionExit(Collision)  当碰撞结束时调用    
    void函数  OnCollisionStay(Collision)  当碰撞结束时调用        
类
    Class   Collision   传递碰撞信息,可获得碰撞所属的物体               
碰撞体勾选Is Trigger成为触发器
    定义  碰撞体勾选为Trigger后,此碰撞体可以被穿透,且碰撞事件无法发生
    作用  当进入触发器范围内,将触发相应行为。不用发生直接碰撞
    方法
    void    OnTriggerEnter(Collider);   当进入触发范围时开始调用
    void    OnTriggerExit(Collider);    当离开触发范围时开始调用
    void    OnTriggerStay(Collider);    当处于触发范围内持续调用
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
碰撞体刚体->碰撞体刚体效果
直接穿透目标物体
直接和目标物体碰撞,但是撞不动
直接和目标物体碰撞,且能把目标物体撞倒
穿透,没有碰撞体作用?
无法移动,因为已经掉下地面

Mesh Renderer

Cast Shadows        投射阴影                    ON/OFF
Receive Shadows     其他的模型是否能投上阴影       ON/OFF
Material            object的外观素材             Element
  • 1
  • 2
  • 3

重要UI组件

定义及用途

定义          用户操作
开发途径       NGUI,UGUI,OnGUI(引擎界面扩展),LegacyGUI
  • 1
  • 2

GUITEXT组件

简介  主要用于文字的显示,在game面板测试
创建  Component->Rendering->GUItext
属性   
       Text->显示文字
       Front Size->文字的大小(单位像素pixel)
       PixelOffset->文字偏移量2D
       Color
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

GUITEXTURE组件

简介  用于图片的显示
创建  通过空物体同GUITEXT进行创建
属性  
    Texture->纹理
    Color->会改变色调
    PixelInset->像素设置,xy是图像位置,wh图像长宽
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结合鼠标事件

简介  
    Input下的是全局时间,若挂载到某一个游戏物体身上,只有鼠标操作该物体时才会发生对应的事件
常用方法    
    OnMouseEnter();OnMouseExit();OnMouseDown();
    进入,退出,单击。
  • 1
  • 2
  • 3
  • 4
  • 5

UI界面搭建思路

(1)整体UI父物体
管理所有UI页面
  • 1
(2)
Start页面
内容  游戏名称    游戏简介    游戏开始按钮
组成  父物体管理整体 字父物体管理  图父物体管理
Stay页面
内容  分数  时间  等运行时内容
组成  父物体管理整体     
Stop页面
内容  提示  重新开始按钮
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
(3)GameManager
形式  
    脚本,用于管理整个游戏的流程逻辑
框架编写    
1、创建当前游戏状态枚举,Start、Stay、Stop    利用枚举类型enum name{aaa,bbb,ccc};
2、查找获取三组UI的引用,并控制它们的显示次序    通过引用.SetActive(T/F);来使得UI页面隐藏或可见
3、定义一个字段,存储当前的游戏状态  
4、定义一个切换游戏状态的方法 Public
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

MonoBehaviour

生命周期

Awake();    
Start();
    名称  刚开始的行为
    作用  每次开始运行后马上进行的行为,执行一次
Update();
    名称  每一帧更新方法
    作用  画面每渲染一次就是一帧,每帧的时间不固定
    缺点  若执行物理行为,则会卡顿
FixedUpdate();
    名称  固定更新方法
    作用  所有和物理相关的操作,代码都要写在此方法中
    参数  固定更新时间Edit->Project Settings->Time
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

碰撞时间

OnCollisionEnter(Collision);    
OnCollisionStay(Collision); 
OnCollisionExit(Collision); 
  • 1
  • 2
  • 3

触发事件

OnTriggerEnter(Collider);   
OnTriggerStay(Collider);    
OnTriggerExit(Collider);    
  • 1
  • 2
  • 3

粒子系统

OnParticleCollision(GameObject);    
  • 1

个体鼠标事件

OnMouseEnter(); 
OnMouseExit();  
OnMouseDown();  
  • 1
  • 2
  • 3

计时器

Invoke(obj,startTime);  
InvokeRepeating(obj,startTime,restTime);    
isInvoking();   Return Bool ;
CancelInvoke(); 
  • 1
  • 2
  • 3
  • 4

常用API

结构体

    属性:黑透白不透
  • 1

----------------------------------------------------------
Input
    键盘  
        GetKey(KeyCode);    
        GetKeyDown(KeyCode);
        GetKeyUp(KeyCode);
    鼠标
        GetMouseButton(int);    
        GetMouseButtonDown(int);
        GetMouseButtonUp(int);
----------------------------------------------------------
GameObject  
    实例  
        GetComponent<T>();      获取游戏物体某个组件
        SendMessage(string);    去执行该go身上的脚本文件中的制定方法执行
                                若要调用其他go脚本中的函数,那个函数为public
        GetComponent<script>().function(paras); 
                                通过获取脚本组件来执行函数。好处是可有参数
    类   
        Find,FindWithTag…       通过名字或tag获取某个GO
        Instantiate(go,position,quaternion);    
                                在某个位置,旋转多少实例化一个物体
        Destory(go,delayTime);  在delayTime后销毁这个物体

----------------------------------------------------------      
Random  
    类   
        Range(minInt,maxInt);   在某个范围内随机生成数
----------------------------------------------------------
Resources   
    类   
        Load(prefabsName[string])as GameObject; 加载Resources文件夹中的预制体
----------------------------------------------------------
Vector3 
    类   New Vector3(x,y,z);     新建一个vector3实例
        RotateTowards(vector3,v3,speed,xxxx)    
    操作  
        minus                   计算两个方向之间的vector差
    属性  
        Vector3.forward,up      世界方向的前方、上方
----------------------------------------------------------
Int 
    类   
        Parse(string);          将string类型的数字转成int类型
    实例  
        .ToString(int);         将int类型的数字转成string类型
----------------------------------------------------------
Color   
    类   
        New Color               RGB都在0~1内
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

enum

物理射线

What?
从一个点往一个方向,发射一根无限长的射线,这根射线与场景中的其余的游戏物体的碰撞体组件相碰撞,射线即结束.

Why?
因为射线可以与物理组件Collider相交互,所以"射线"也被称为"物理射线".

Where?
攻击使用的技能

How?
通过摄像机创建射线
思路:由发射射线的实例物体A向屏幕上某一位置的点P发射一条射线,获得一条A与P先关的ray实例
    go  
        Camera.main 引用  tag被设置为"MainCamera"的摄像机的引用
    Ray 
        go.ScreenPointToRay(Vector3)把屏幕点转化为射线
    Input.mousePosition 
        鼠标所在的位置值
    Ray 
        结构体 
检查射线与其他物体的碰撞
思路:由Physics的静态类Raycast来检测与ray相关的碰撞bool,同时得RaycaseHit结构体存储碰撞信息
    RaycaseHit  
        结构体 
        用于存储射线的碰撞信息
    bool    
        Physics.Raycast(Ray,out RaycastHit)         静态函数    
        检测Ray对象,一旦有碰撞则返回真
        并把碰撞信息存在RaycastHit
    raycastHit->collider.gameobject
        实例  
        通过碰撞信息相关的碰撞体找到其所属的go
        Collider    【组件】    与A发生碰撞的物体身上的碰撞盒,可间接获取gameobject
        Point   【Vector3】   发生碰撞的位置
Debug?
    Debug.DrawRay(vector3,vector3,color);           起点位置,终点-起点的方向,颜色
    Debug.DrawLine(vector3,vector3,color);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

特效

TrailRenderer拖尾渲染器

作用  
    体现物体运动速度快
创建  
    Component->Effects->TrailRenderer
    Materials   设置透明材质球。多条线
属性  
    Time->拖尾的消失时间   
    StartWidth->开始的宽度
    EndWidth->结束的宽度
    Color->渲染多色
举例  
    成为展示物体的子物体
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

LineRenderer线渲染器

作用  
    激光
创建  
    Component->Effects->LineRenderer
属性  
    Position->设置线的开始点和结束点
    StartWidth->开始宽度
    EndWidth->结束宽度
    StartColor->开始颜色
    EndColor->结束颜色
实例函数    
    SetPosition(int index,vector3 position);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

材质球

透明材质球
设置该材质球的Shader为Particle/Additive(例子/添加物)
再添加素材
  • 1
  • 2

动作特效

碎裂
多个子物体组在一起,碰撞盒有交叉部分
动态AddComponent<RigidBody>来产生碰撞散列效果
  • 1
  • 2

声音组件

AudioSource

资源  
    AudioClip音频剪辑
格式  
    Aif,wav,mp3,ogg
文件  
    Audios
作用  
    播放音频资源的组件
创建  
    Component->Audio->AudioSource
属性  
    AudioClip->制定播放文件
    PlayOnAwake->游戏一开始运行就执行
    Loop->是否循环播放T/F        Mute->是否静音T/F
    Volumn->音量0-1
    SpatialBlend->空间混合0为2D声音,1为3D
函数  
    Play();Stop();Pause();实例的直接函数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

AudioListener

作用  
    只有有这个组件,我们才可以听到声音(在摄像机身上)
  • 1
  • 2

编程基础

Coroutine

定义  
    协程,协同程序。使得顺序执行的两个行为并行
前提  
    继承MonoBehaviour
形式  
    IEnumerator Func(){
            Yield return new WaitForSeconds(2);
            代码片段;
    }
说明  
    Ienumerator->协同程序的返回值类型
    yield return->协同程序返回   
    new WaitForSeconds(s)->实例化一个对象,等待s秒后继续执行;
执行  
    StartCoroutine("funcname");
终止  
    StopCoroutine("funcname");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

脚本的生命周期

意义  
    所挂载的游戏物体的声明周期
前提  
    继承MonoBehaviour
Awake() 
    唤醒,在整个游戏中只执行一次。即使脚本此时并没有执行,此函数也在底层执行了
OnEnable()  
    启用,之执行一次。当脚本组件被启用的时候执行一次,即启用脚本
Start() 
    开始,只执行一次。开始运行脚本
LateUpdate()    
    在Update每次执行后跟着执行,但是这个方法好像在Start执行后先执行了一次
OnGUI() 
    渲染GUI系统一般是Update的两倍执行次数
FixedUpdate()   
    0.02s执行一次,固定更新时间,所有物理组件相关的更新在此执行
Update()    
    更新,执行N次,每帧执行一次
OnDisable() 
    在OnDestroy()执行前执行,脚本的禁用事件
OnDestroy() 
    销毁
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

常用工具类

Screen
    作用      
        包含屏幕相关信息
    常用属性    
        Screen.width,Screen.height只读属性
Time
    作用              
        包含与时间相关的信息
    属性
        Time.time       静态只读,从游戏开始到现在所经过的秒数
        Time.deltaTime  静态只读,是渲染完上一帧的时间。倒计时
        Time.timeScale  静态属性,时间缩放。可以用于暂停游戏。1:正常,0.5:慢放倍数,0暂停。
                        是deltaTime的缩放情况
Mathf
    类型  
        结构体
    常用函数    
        绝对值,最大值、最小值,四舍五入round
    插值运算函数  
        Mathf.Lerp(float a, float b, float t);在a和b间相隔t
        A = Mathf.Lerp(A,10,Time.deltaTime);保存插值,实时更新
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Caos问题

1、静态成员变量
被所有实例所共有。当一个实例修改了其值,其他实例在用的时候也是用这个新修改的值

2、error:Cannot modify a value type return value of  '…'. Consider storing the value in a temporary variable.
问题原因:部分具体的变量无法直接修改
解决方案:如要修改Color col 中的col.r,则先Color temp = col,临时修改temp.r,再将temp赋值给col这个整体
总结:即小项无法修改时,直接用修改过的大项来进行整体覆盖 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/332921
推荐阅读
相关标签
  

闽ICP备14008679号