开学啦!接下来学习Unity的寻路系统和射线!结尾有彩蛋呦!
每日一句:少年特有的放浪不羁是青春的定义
目录
关节
铰链关节(Hinge Joint)
将两个刚体(Rigidbody)组合在一起,从而将其约束为如同通过铰链连接一样进行移动,它适合门、链条、钟摆等进行模拟效果
属性
Connected Body连接的刚体
Anchor 锚点 刚体围绕锚点进行摆动
Axis 转向轴X 0,Y 0,Z 1小球围绕z轴有旋转效果
Use Spring 使用弹簧
Spring 弹性 Target Position 目标角度 Damper阻力
Use Moter 使用发动机,使对象发生旋转
Target Velocity 目标速率(正值就正方向,负值就反方向) Force作用力
Use Limits(与Moter配合使用)限制
Min/Max 最小/大角度(相对于锚点的)
Break Force铰链关节断开力(断开后Hinge Joint组件就移除了)
Enable Collision启用碰撞(针对连接的物体)
//撞飞
private void OnCollisionStay(Collision other)
{if(other.collider.tag==” “)
{other.rigidbody.AddForce(Vector3.forward*500);}
}
弹性关节Spring Joint/sprɪŋ dʒɔɪnt/
固定关节Fixed Joint
角色关节Character Joint
可配置关节configuration/kənˌfɪɡəˈreɪʃn/
布料
Skinned Mesh Renderer蒙皮网格渲染器组件
Mesh呈现布料形状(None(Mesh))
Mericals材质
Cloth组件
点击
Cloth Constrains/kənˈstreɪnz/布料约束
Visualization/ˌvɪʒuəlaɪˈzeɪʃn/:Max Distance最大距离(与初始点的偏移量) Surface Penetration表面约束
Select 选择,某个点再去设置相关属性;Paint笔刷先设置属性再去刷
MaxDistance可以设置每个顶点最大可移动距离,常用将不能动的顶点MaxDistance设置为0
Surface Penetration/ˌpenəˈtreɪʃ(ə)n/表面嵌入控制,控制的是:顶点最大可以嵌入到Mesh里面的程度,在网格顶点比较稀疏的情况下可以明显对比出差别
Stretching/ˈstretʃɪŋ/ Stiffness/ˈstɪfnəs/拉伸刚度
Bending Stiffness弯曲程度
Use Teehers 绳索属性,两个固定点之间的属性
External /ɪkˈstɜːn(ə)lAcceleration恒定加速度
Random Acceleration/əkˌseləˈreɪʃ(ə)n/随机加速度[模拟风效]
World Velocity Scale与World Acceleration Scale共同组成布料运动时的物理模拟造成的影响比例
Capsule Colliders 胶囊碰撞(用以固定布料)
Use Continuous Collision 连续碰撞检测,增加消耗,减少直接穿透碰撞的几率
Use Virtual Particles添加一个虚拟粒子碰撞每个三角形来提高稳定性
视频播放
Video Player组件
①挂在模型上
Video Player组件
Source URL(大的视频放在网格上,输入网址即可播放)
Video Clip(本地的,拖入到Video Clip上即可播放)
Playback Speed 播放速度
Volume音量
Mute静音
②
Create—>Render Texture(拖到Plane)
建一个Plane/Cube添加Video Player组件
[Target Texture拖进来]
Render Mode选Render Texture
{与①区别:Aspect Ratio可以用}
③
Render Mode—>Camera Far/Near Plane
Camera—>Main Camera
④在UI上播放
UI—>Raw Image挂个Video Player组件
Create—>Render Texture 拖到Raw Image的Texture
Render Mode选Render Texture
Character Controller组件
属性
Center 调整碰撞体位置
Radius碰撞体半径
Height碰撞体高度
Slope Limit坡度限制,用于设置所控制的游戏对象只能爬上角度小于或等于参数值的斜坡
Step Offset台阶高度,游戏对象可以迈上的最高台阶高度
Skin Offset皮肤厚度,该参数决定两个碰撞体可以互相渗入的深度,较大的参数值会产生抖动现象,较小的参数值会导致所控制的游戏对象被卡住,合理的设置为Radius值的10%
GameObject—>Cinemachine—>Virtual Camera(2019)
Windows—>PackageManager—>Virtual Camera(2020)
CinemachineVirtualCamera
Follow跟随目标
Look At瞄准
[用Body、Aim调整镜头视角]
Body
Binding Mode选Lock To Target Assign【MoveLikeTopDown()】
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharacterControllerDemo : MonoBehaviour
{
private CharacterController controller;
public float Speed = 10f;
public float RotateSpeed = 1f;
public float Gravity = -9.8f;
private Vector3 velocity = Vector3.zero;//重力产生的移动量
public Transform groundcheck;//获取检测的物体
public float checkradius=0.2f;//物体的检测半径
private bool IsGround;//判断物体是否已经落到地面上
public LayerMask layerMask;
public float jumphight = 3f;
// Start is called before the first frame update
void Start()
{
controller = transform.GetComponent<CharacterController>();
}
// Update is called once per frame
void Update()
{
MoveLikeWow();
MoveLikeTopDown();
}
private void MoveLikeWow()
{
IsGround = Physics.CheckSphere(groundcheck.position, checkradius, layerMask);
if(IsGround&&velocity.y<0)
{
velocity.y = 0;
}
if(IsGround&&Input.GetButtonDown("Jump"))
{
velocity.y += Mathf.Sqrt(jumphight * -2 * Gravity);
}
var herizontal = Input.GetAxis("Horizontal");
var vertical = Input.GetAxis("Vertical");
var move = transform.forward * Speed * vertical * Time.deltaTime;
controller.Move(move);
velocity.y += Gravity * Time.deltaTime;
controller.Move(velocity * Time.deltaTime);
transform.Rotate(Vector3.up, herizontal * RotateSpeed);
}
private void MoveLikeTopDown()
{
var herizontal = Input.GetAxis("Horizontal");
var vertical = Input.GetAxis("Vertical");
var dicrection = new Vector3(herizontal, 0, vertical).normalized;
var move = dicrection * Speed * Time.deltaTime;
controller.Move(move);
var playerScreenPoint = Camera.main.WorldToScreenPoint(transform.position);
var point = Input.mousePosition - playerScreenPoint;
var angle = Mathf.Atan2(point.x, point.y) * Mathf.Rad2Deg;
transform.eulerAngles = new Vector3(transform.eulerAngles.x, angle, transform.eulerAngles.z);
}
/*推墙*/
private void OnControllerColliderHit(ControllerColliderHit hit)
{
if(hit.transform.CompareTag("Wall"))
{
hit.rigidbody.AddForce(transform.forward * Speed);
}
}
}
/*角色爬上去,自动落下来,需要条件检测人物是否在地面上,若在停止计算。加一空物体在人物下方,用来检测与地面碰撞*/
/*跳跃Edit—>Project Settings—>InputManager—>Jump*/
彩蛋!
面向对象原则
*单一职责原则
一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中
√一个类(或者大到模块小到方法)承担的职责越多,它被复用的可能性越小
√类的职责主要包括两个方面:数据职责(通过属性来体现)和行为职责(通过其方法来体现)
√单一职责原则是实现高内聚、低耦合的指导方针
*开闭原则
一个软件实体应当对扩展开方,对修改关闭
√抽象化是关闭原则的关键
*里氏代换原则
在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象
√里氏代换原则是实现开闭原则的重要方式之一。在程序中尽量使用基类类型对对象进行定义,而在运行时在确定其子类类型,用子类对象来替换父类对象*依赖倒转原则
代码要依赖于抽象的类,而不要依赖于具体的类;要针对接收或抽象类编程,而不是针对具体的类编程
√抽象方式耦合是依赖倒转原则的关键
*接口隔离原理
使用多个专门的接口,而不使用单一的总接口
√接口仅仅提供于客户端需要的行为,即所需的方法,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口,而不提供大的总接口
*合成复用原则
尽量使用组合/聚合关系,少用继承
√继承复用:实现简单,易于扩展;破坏系统封装性
组合/聚合复用:耦合度相对较低,选择性地调用成员对象的操作
因此,一般首选使用组合/聚合来实现复用,其次才考虑继承,在使用继承时,需严格遵循里氏代换原则
*迪米特法则
一个软件应当尽可能少的与其他实体发生相互作用,可通过引入一个合理的第三者来降低现有对象之间的耦合度
√注意:在类的划分上,应当尽量创建松耦合的类
在类的结构设计上,每个类都应当尽量降低其成员变量和成员函数的访问权限
在类的设计上,只要有可能,一个类应当设计成不变类
在对其他类的引用上,一个对象对其他对象的引用应当降到最低