unity入门学习实验——控制游戏物体运动

Posted Neymessi_JR

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity入门学习实验——控制游戏物体运动相关的知识,希望对你有一定的参考价值。

一、实验目的与目标

1、用cube当主角,放一Plane当地面,cube加刚体,控制游戏对象前进、后退、左右旋转

2、进阶(选座):主角移动做为第三人称控制,在画面右上(或左上)角增加小地图功能

二、实验过程及结果

1、添加plane组件、cube组件,

2、为组建添加图片素材易于辨认区分,并为cube组件加入刚体属性,设置cube刚体的重量属性至合适值。

 

 3、新建脚本文件,并为脚本文件重命名为“move”

 4、双击脚本,打开脚本编译器(编译器版本visual studio 2019),在编译器中为物体添加控制移动的代码,如图。

控制物体移动的move脚本相关代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class move1 : MonoBehaviour

    // Start is called before the first frame update
    void Start()
    
        
    

// Update is called once per frame

    void Update()
     
        Vector3 moveForward = Vector3.zero;
        if(Input.GetKey(KeyCode.W))
        
            moveForward.z += 1;
        
        if (Input.GetKey(KeyCode.S))
        
            moveForward.z += -1;
        
        if (Input.GetKey(KeyCode.A))
        
            moveForward.x += -1;
        
        if (Input.GetKey(KeyCode.D))
        
            moveForward.x += 1;
        
        GetComponent<Rigidbody>().MovePosition(Quaternion.LookRotation(transform.forward) * moveForward + moveForward * Time.fixedDeltaTime + transform.position); 

保存回到主界面,将move脚本拖拽绑定至cube,使move脚本绑定至cube组件,刷新脚本,保存,可以查看到cube组件的属性页面出现move组件的相关信息,此时即绑定成功,随后点击运行,通过WASD按键即可实现cube组件的前后左右移动。如图所示:

 

5、(进阶内容)新建一个摄像机,命名为camera2。 

 

调整camera2的参数,使预览页面中camera2的视野位置来到左上角并且大小合适,以此来实现小地图的功能:

 

调整摄像机角度,使得cube位于小地图视野中央

6、拖拽maincamera以及camera2至cube组件,使其变为cube组件的子组件,同cube绑定,以此来实现角色第三人称视角的绑定,以及角色始终处于小地图正中央的效果:

 

 

7、拓展回顾:可以将本次实验与第一次的重力撞墙实验相结合,添加具有刚体属性的多个cube组件,并且组成墙面,调节主角色的重量至合适值,就可以实现利用WASD键控制cube组件前后左右运动冲击墙面的效果

 

 

三、实验总结与反思

本次实验难度相较于第一次实验有较大提升,主要表现在需要进行脚本代码的编写。

本次实验中,原本想在控制人物前后左右运动的基础上进行拓展,实现利用空格键space操控角色跳跃,但是代码编写之后遇到了问题,不太清楚代码的逻辑,并且对于跳跃的运行机制也不了解,所以无奈只能从脚本中删除了这一段代码。

 

 

 

Unity物理组件之刚体Rigidbody

一、刚体组件简介

1、刚体简介

刚体:Rigidbody,属于物理类组件

作用:添加了刚体组件的游戏物体,可以在物体系统的控制下来运动,刚体可接受外力和扭矩力用来保证游戏对象像在真实世界中那样进行运动。任何游戏对象只有添加了刚体组件才能受到重力的影响,通过脚本为游戏对象添加的作用力以及通过NVIDIA物体引擎与其他的游戏对象发生互动的运算都需要游戏对象添加了刚体组件。没有刚体(RigidBody)组件,游戏对象之间可以相互穿透,不会产生碰撞。

2、给物体添加刚体组件

选中游戏物体-->菜单Component-->Physics-->Rigidbody

二、刚体组件属性

Mass: 质量

定义:该项用于设置游戏对象的质量,也就是重量。质量单位是KG(建议在同一个游戏场景中,游戏对象之间的质量差值不要大于100倍)

Drag: 阻力

定义:当对象受力运动时受到的空气阻力。0表示没有空气阻力,阻力极大时游戏对象会立即停止运动

Angular Drag: 角阻力

定义:当对象受扭矩力旋转时受到的空气阻力。0表示没有空气阻力,阻力极大时游戏对象会立即停止运动

Use Gravity: 使用重力

定义:若开启此项,游戏对象会受到重力的影响

Is Kinematic: 是否开启动力学

定义:若开启此项,游戏对象将不再受物体引擎的影响从而只能通过Transform(几何变换组件)属性来对其操作。该方式适用于模拟平台的移动或带有铰链关节链接刚体的动画

Interpolate: 插值

定义:该项用于控制刚体运动的抖动情况,有3项可供选择。

None:没有插值

Interpolate:内插值。基于前一帧的Transform来平滑此次的Transform

Extrapolate:外插值。基于下一帧的Transform来平滑此次的Transform

Collision Detection: 碰撞检测

定义:该属性用于控制避免高速运动的游戏对象穿过其他的对象而未发生碰撞,有3项可供选择。

Discrete: 离散碰撞检测。该模式与场景中其他的所有碰撞体进行碰撞检测。该项为默认值。

Continuous:连续碰撞检测。该模式用于检测与动态碰撞体(带有Rigidbody)的碰撞,使用连续碰撞检测模式来检测与网络碰撞体的(不带Rigidbody)碰撞。其他的刚体会采用离散碰撞模式。此模式适用于那些需要与采用连续动态碰撞检测的对象相碰撞的对象。这对物理性能会有很大的影响,如果不需要对快速运动的对象进行碰撞检测,就使用离散碰撞检测模式。

Continuous Dynamic:连续动态碰撞检测模式。该模式用于检测与采用连续碰撞模式或连续动态碰撞模式对象的碰撞,也可用于检测没有Rigidbody的静态网格碰撞体。对于与之碰撞的其他对象可采用离散碰撞检测,动态连续碰撞检测模式也可用于检测快速运动的游戏对象。

Constrains: 约束

定义:该项用于控制对于刚体运动的约束。

Freeze Position:冻结位置。刚体对象在世界坐标系中的X、Y、Z轴方向上(勾选状态)的移动将无效。

Freeze Rotation:冻结旋转。刚体对象在世界坐标系中的X、Y、Z轴方向上(勾选状态)的旋转将无效。

 三、使用刚体移动物体

1.相关方法

Rigidbody.MovePosition(Vector3):使用刚体移动物体的位置。

使用刚体移动物体,物体是根据世界坐标系的方向移动的。 使用刚体移动物体,物体会触发物理相关的事件。

2.参数

MovePosition 中的 Vector3 要使用“当前位置”+ 方向 的方式。

Transform.Position:属性 当前物体的位置。

3.特点

使用刚体移动物体,特点如下:

①会于场景中的模型物体发生碰撞;

②会受重力影响(到达场景边缘外,会下落)

四、应用

1)创建游戏对象

创建 Cube 和 Plane 游戏对象,如下:

2)给 Cube 游戏对象添加刚体组件

选中 Cube 游戏对象,点击 Add Component 按钮,搜索 Rigidbody,添加刚体组件。

3)添加 RigidbodyMove脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RigidbodyMove : MonoBehaviour

	private Rigidbody m_rigidbody;
	private Transform m_transform;

	//Use this for initialization
	void Start()
		m_rigidbody = gameObject.GetComponent<Rigidbody>();
		m_transform = gameObject.GetComponent<Transform>();

	
	
	//Update is called once per frame
	void Update()
	
		if (Input.GetKey(KeyCode.W))
		
			m_rigidbody.MovePosition(m_transform.position + Vector3.forward * 0.2f);
		

		if (Input.GetKey(KeyCode.S))
		
			m_rigidbody.MovePosition(m_transform.position + Vector3.back * 0.2f);
		

		if (Input.GetKey(KeyCode.A))
		
			m_rigidbody.MovePosition(m_transform.position + Vector3.left * 0.2f);
		

		if (Input.GetKey(KeyCode.D))
		
			m_rigidbody.MovePosition(m_transform.position + Vector3.right * 0.2f);
		

	
  

以上是关于unity入门学习实验——控制游戏物体运动的主要内容,如果未能解决你的问题,请参考以下文章

在unity3d里怎样隐藏物体?

Unity3DUnity 游戏画面帧更新 ( 游戏物体 GameObject 移动 | 借助 Time.deltaTime 进行匀速运动 )

Unity物理组件之刚体Rigidbody

关于Unity中物理引擎的使用

SIKI_Unity_2_入门_通过实例学习游戏的存档和读档

unity中鼠标点击触发物体运动