unity学习笔记13

一、常用物理关节

Unity中的物理关节(Physics Joints)是用于在游戏中模拟和控制物体之间的连接。物理关节允许你在对象之间应用各种约束,例如旋转、移动或固定连接,以模拟真实世界中的物理交互。

物理关节类型:

1.Fixed Joint(固定关节): 固定关节将两个物体连接在一起,使它们不能相对移动。这种关节通常用于创建可靠的连接,如门或机械臂。

2.Hinge Joint(铰链关节): 铰链关节允许物体在一个轴周围旋转。这种关节类似于门的铰链,允许对象绕一个点旋转。

3.Spring Joint(弹簧关节): 弹簧关节允许对象之间的相对运动,并在这种相对运动中引入弹簧效果。可以使用弹簧关节模拟弹簧振动或其他弹性连接。

4.Character Joint(角色关节): 角色关节允许在物体上应用限制和驱动,以模拟角色动作。这在模拟人物关节,如膝盖或肩膀,非常有用。

5.Configurable Joint(可配置关节): 可配置关节是一种灵活的关节,可以配置为模拟各种不同类型的连接,包括球关节、铰链关节等。

6.Slider Joint(滑动关节): 滑动关节允许两个物体沿一个轴相对移动。这对于创建滑动门或抽屉等效果非常有用。

7.Distance Joint(距离关节): 距离关节限制两个物体之间的距离。这可以用于模拟绳索、弹簧等。

8.Wheel Joint(车轮关节): 车轮关节是一种特殊类型的关节,专门用于模拟车辆的轮子运动。

示例:铰链关节

现在给物体加一个Hinge Joint(铰链关节),让其达到开关门的效果。

图中的灰色的箭头就是铰链的方向,物体是绕着铰链方向旋转的。

要达到门的开关效果就要改变箭头的位置,让其在左边并朝向上方。修改如下属性:

Anchor(锚点)属性:这决定了Hinge Joint连接的两个物体相对于彼此的位置。

如果你将Anchor属性设置为(0, 0, 0),那么连接的两个物体的中心将完全重合。

Axis属性定义了物体围绕其旋转的轴。轴是一个单位向量,指示旋转的方向。

例如,如果Axis属性设置为(0, 1, 0),物体将绕Y轴旋转。

修改好之后效果如下:

当物体去撞门,那么门就会绕着铰链旋转

注意事项:

当在使用Hinge Joint时,确保连接的两个物体都有刚体组件,因为物理关节需要作用于刚体

示例:弹簧关节

给两个物体加上刚体,给上面的物体的刚体组件开启 是运动学的选项,这样运行游戏时只有下面的物体向下掉。

现在要给这个两个物体之间加上弹簧关节,为上面的物体加上 Spring  Joint 组件,然后将下面的物体拖动到已连接实体位置

运行游戏后下面的物体他就不会掉落到地面上,而是有弹簧连接的效果


 

二、物理材质

在Unity中,物理材质(Physics Material)是一种用于控制碰撞和摩擦的资源。物理材质通常应用于 Collider 组件,以调整对象之间的物理交互。

作用:

摩擦控制: 物理材质用于调整碰撞体之间的表面摩擦力。通过设置摩擦力和滑动摩擦力,可以模拟不同表面之间的摩擦效果,如冰面或沙地。

弹性和弹力: 弹性和弹力是物理材质中的两个重要属性。它们控制碰撞体在碰撞时的反弹效果,使得物体在碰撞后能够反弹、弹跳或吸收能量。

摩擦力的变化: 物理材质还可以根据相对速度的大小来调整摩擦力,使物体在不同速度下表现出不同的摩擦效果。

创建方式:

在Unity中,可以通过选择Assets -> Create -> Physic Material来创建一个物理材质。

在创建物理材质后,你可以在窗口中设置摩擦力(Friction)和弹力(Bounciness)等属性。摩擦力定义了物体在表面上滑动的难度,而弹力定义了碰撞时的反弹效果。

应用到Collider: 将物理材质应用到对象的Collider组件上。选择对象,然后将物理材质拖放到Collider组件的材质属性上。

  • 14
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码在文件 Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {} _SpecularTex ("Specular (R) Gloss (G) Anisotropic Mask (B)", 2D) = "gray" {} _BumpMap ("Normal (Normal)", 2D) = "bump" {} _AnisoTex ("Anisotropic Direction (RGB)", 2D) = "bump" {} _AnisoOffset ("Anisotropic Highlight Offset", Range(-1,1)) = -0.2 _Cutoff ("Alpha Cut-Off Threshold", Range(0,1)) = 0.5 } SubShader{ Tags { "RenderType" = "Opaque" } CGPROGRAM struct SurfaceOutputAniso { fixed3 Albedo; fixed3 Normal; fixed4 AnisoDir; fixed3 Emission; half Specular; fixed Gloss; fixed Alpha; }; float _AnisoOffset, _Cutoff; inline fixed4 LightingAniso (SurfaceOutputAniso s, fixed3 lightDir, fixed3 viewDir, fixed atten) { fixed3 h = normalize(normalize(lightDir) + normalize(viewDir)); float NdotL = saturate(dot(s.Normal, lightDir)); fixed HdotA = dot(normalize(s.Normal + s.AnisoDir.rgb), h); float aniso = max(0, sin(radians((HdotA + _AnisoOffset) * 180))); float spec = saturate(dot(s.Normal, h)); spec = saturate(pow(lerp(spec, aniso, s.AnisoDir.a), s.Gloss * 128) * s.Specular); fixed4 c; c.rgb = ((s.Albedo * _LightColor0.rgb * NdotL) + (_LightColor0.rgb * spec)) * (atten * 2); c.a = 1; clip(s.Alpha - _Cutoff); return c; } #pragma surface surf Aniso #pragma target 3.0 struct Input { float2 uv_MainTex; float2 uv_AnisoTex; }; sampler2D _MainTex, _SpecularTex, _BumpMap, _AnisoTex; void surf (Input IN, inout SurfaceOutputAniso o) { fixed4 albedo = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = albedo.rgb; o.Alpha = albedo.a; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex)); fixed3 spec = tex2D(_SpecularTex, IN.uv_MainTex).rgb; o.Specular = spec.r; o.Gloss = spec.g; o.AnisoDir = fixed4(tex2D(_AnisoTex, IN.uv_AnisoTex).rgb, spec.b); } ENDCG } FallBack "Transparent/Cutout/VertexLit" }[/code]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值