使用Unity建立摄像机与人物等距控制器 VR开发教程

manew_JR 2017-07-12 17:14:48
在这篇文章中,我将详细介绍如何创建一个简单的等距摄像机和人物控制器。在本教程结束时,您应该有一个简单的3D人物,您可以使用键盘上的WASD键在一个等距场景中移动。
 
什么是等距游戏?
 
一个等距的游戏是对摄像机使用一个等距的角度。一些流行的例子是星际争霸、暗黑破坏、火炬光、堡垒或晶体管等游戏。从本质上来说,摄像机从一个角度来看,以45度的旋转角度来观察这个世界。
 
为什么要使用等距摄像机?
 
在我看来,有三个原因可以解释为什么你可以使用一个等距相机。第一个原因是风格。拥有一台等距相机可能是你的游戏风格的选择。等距视角可以使游戏看起来更三维,即使它是2D的。在某种程度上,它给你的游戏增加了一种深度感。也许这个伪3d风格就是你想展示你的游戏的方式。
 
 
因为等距视角创造了3D的幻觉,所以使用它有一个很大的理由。一般来说,为游戏创建2D资源会更快更容易。3D建模是一个更加复杂的过程,同时也更加要求硬件。使用一个等距视图,你可以创建一个看起来足够三维的东西,而无需创建3D模型。这可以为开发人员节省大量的时间和金钱,尤其是在独立游戏领域。
 
另一个原因与游戏的玩法有关。也许你想要的游戏要求你的玩家一次能够在屏幕上看到大量的信息。Overhead视角允许这样做。这就是为什么大多数实时策略游戏都使用了一种或可旋转的Overhead视角的一个重要原因。它允许玩家在任何给定的时间在屏幕上看到所有的敌人和盟友。它为他们提供了许多关于他们当前状况的信息,并允许他们做出更明智的战术决策。它使得在地图上选择和移动组件变得更加容易。考虑以第一人称视角玩实时战略游戏的想法。对于玩家来说,在地图上选择和移动组件是非常困难的,因为他们只能在任何时候看到他们面前的东西
 
 
 
考虑一下上面的一种叫做“国王时代”的游戏。你指挥一群中世纪的战士。有了一个等距视图,您可以轻松地选择您的组件,并将它们发送到地图上。想象一下,试图在没有开销视角的情况下命令所有这些组件。这将是一场噩梦。
 
 
问题
摄像机的45度旋转会给在镜头中移动一个人物带来一些麻烦。
请考虑下面我的画图(玩家轴不包括y轴):
 
 
 
在Unity中,当我们在镜头的y轴上进行45度旋转时,我们的世界轴不会随之改变。相反,世界轴保持不变的旋转。现在,看看预定的玩家旋转轴。理想情况下,我们希望我们的键盘上的D键能直接将玩家移动到右边,这是基于我们作为玩家的视角。注意,这个球员想要的x轴是45度,与世界x轴不同。我们想要创建一个控制器来解释这个世界轴和玩家轴之间的旋转的不同。否则,如果我们不适应这种差异,那么告诉我们的人物右移会使他们跟随世界轴,这将使他们从我们的角度向右移动。我们来看看如何解决这个问题。
 
 
如何解决这个问题:
我要假设你们已经知道了Unity的基本原理。继续使用3D设置创建一个新的Unity 3D项目。
 
1.创建一个新的地形对象
 
2。修改地形设置,使地形的宽度和长度为50。要做到这一点,点击地形,点击检查器中地形组件上的齿轮图标。
 
 
 
 
3。从您的层次结构中删除主摄像机。
 
 
4。创建一个空的游戏对象,并将其重命名为“CameraTarget”。设置position为(0,18,0),rotation为(30,45,0)。这个旋转变量能够产生isometric视角。
 
 
 
 
5。在你的等级结构中右键点击“摄像头”游戏对象,并从菜单中选择“摄像头”。这将是我们的新主相机。它一定是CameraTarget 的子类。
 
 
 
6。将新相机的标签更改为MainCamera标签。
 
 

7将摄像机组件的投影设置更改为Orthographic。这将使我们的场景看起来更像2D而不是3D。这种设置是一种风格上的选择。如果您喜欢透视图,那么就使用它。
 
 
 
8。改变正相机的大小,直到你得到你想要的外观。这个尺寸将改变我们的相机所能看到的场景。
 
 
 
 
9。现在我们将创建一个简单的播放器。创建一个立方体游戏对象
 
 
10。向多维数据集添加一个rigidbody组件
 
 
 
11。在我们创建脚本之前,我们需要设置我们的输入。编辑项目设置输入
 
 
 
12。将输入的大小更改为20
 
 
13。展开下面两个输入框,并根据下面的截图来设置它们:
 
 
 
14。单击您场景中的多维数据集,并添加一个新的脚本组件。调用脚本CharController。
 
 
 
15。用下面的代码替换脚本中的代码。代码被注释来帮助描述逻辑。
 
[C#] 纯文本查看 复制代码
 
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CharController : MonoBehaviour {[SerializeField]
float moveSpeed = 4f; //Change in inspector to adjust move speedVector3 forward, right; // Keeps track of our relative forward and right vectorsvoid Start()
{
forward = Camera.main.transform.forward; // Set forward to equal the camera's forward vector
forward.y = 0; // make sure y is 0
forward = Vector3.Normalize(forward); // make sure the length of vector is set to a max of 1.0
right = Quaternion.Euler(new Vector3(0, 90, 0)) * forward; // set the right-facing vector to be facing right relative to the camera's forward vector
}void Update()
{
if(Input.anyKey) // only execute if a key is being pressed
Move();
}void Move()
{
Vector3 direction = new Vector3(Input.GetAxis("HorizontalKey"), 0, Input.GetAxis("VerticalKey")); // setup a direction Vector based on keyboard input. GetAxis returns a value between -1.0 and 1.0. If the A key is pressed, GetAxis(HorizontalKey) will return -1.0. If D is pressed, it will return 1.0
Vector3 rightMovement = right * moveSpeed * Time.deltaTime * Input.GetAxis("HorizontalKey"); // Our right movement is based on the right vector, movement speed, and our GetAxis command. We multiply by Time.deltaTime to make the movement smooth.
Vector3 upMovement = forward * moveSpeed * Time.deltaTime * Input.GetAxis("VerticalKey"); // Up movement uses the forward vector, movement speed, and the vertical axis inputs.Vector3 heading = Vector3.Normalize(rightMovement + upMovement); // This creates our new direction. By combining our right and forward movements and normalizing them, we create a new vector that points in the appropriate direction with a length no greater than 1.0transform.forward = heading; // Sets forward direction of our game object to whatever direction we're moving in
transform.position += rightMovement; // move our transform's position right/left
transform.position += upMovement; // Move our transform's position up/down
}
}Vector3 heading = Vector3.Normalize(rightMovement + upMovement); // This creates our new direction. By combining our right and forward movements and normalizing them, we create a new vector that points in the appropriate direction with a length no greater than 1.0transform.forward = heading; // Sets forward direction of our game object to whatever direction we're moving intransform.position += rightMovement; // move our transform's position right/left     transform.position += upMovement; // Move our transform's position up/down
     }
}
 
16。在这一点上,你的场景应该起作用。试着运行游戏,使用WASD将你的方块移动到地图上。你会注意到你的立方体在你期望旋转发生的方向上旋转。
 
结论
电子游戏的历史充斥着各种电子游戏。这是一种非常普遍的风格,很重要的一点是,要理解如何开发一个具有永久旋转的游戏,你必须与之合作。本教程是一个简单的例子,它将帮助您理解如何推进您的开发。也许现在你可以完成游戏世界的下一个大型动作rpg游戏了!
99VR视界二维码
热门推荐
Hot Recommended
在线客服