c# - 如何在等距 2D 游戏中限制相机
问题描述
我正在开发一个 2D 等距游戏,就像帝国时代 2、TTD、Into the Breach 等。我正在使用 Unity 和 C#
相关事实:我正在使用 Isometric Tilemap
我希望相机限制与地图边界保持一致,就像上面提到的游戏一样,但我遇到了困难,我在这方面花了很多时间,我开始质疑自己是否值得使用 Isometric Tilemap 或做通常的方法,只需旋转相机即可制作常规的 2D 游戏。
这是我的第一个问题:Isometric Tilemap 真的值得还是通常的方法更好(带有旋转相机的非等距 2D 游戏)?如果是这样,如何在 Unity 中做到这一点?
尽管如此,我实现的代码如下,但它有两个错误:
- 相机卡住
firstBase
,thirdBase
如果用户按下右/左键和上/下箭头键 - 如果相机在边界上移动,它可能会逃脱它
void Start(){
CameraMovement_Limits();
}
void CameraMovement_Limits(){
Vector3 gridOrigin = tilemapFloor.GetCellCenterWorld(tilemapFloor.origin);
float gridHypotenuse = ((tilemapFloor.size.x - 1) * tilemapFloor.cellSize.y);
homePlate = gridOrigin + new Vector3(0, 0, -10);
firstBase = gridOrigin + new Vector3(gridHypotenuse, gridHypotenuse/2, -10);
secondBase = gridOrigin + new Vector3(0, gridHypotenuse, -10);
thirdBase = gridOrigin + new Vector3(-gridHypotenuse, gridHypotenuse/2, -10);
}
void Update(){
CameraDiagonalMovement();
}
bool CheckCameraPosition(Vector2 p1, Vector2 p2, Vector2 pos){
//This is what this function do:
//find the linear equation for the line formed by 'p1' and 'p2' coordinates
//insert 'pos' coordinate on the equation and stores the result in 'ind'
//if 'ind' is positive, it means that 'pos' is above the line
//if its negative, its above
//if its zero, its on the line
//resuming, this funtion tells if 'pos' is above or below a line formet by 'p1' and 'p2'
float a = (p1.y - p2.y) / (p1.x - p2.x);
float ind = pos.y - p2.y - (a * (pos.x - p2.x));
return ind >= 0;
}
void CameraDiagonalMovement(){
Vector3 vecZero = Vector2.zero;
camPos = (Vector2)transform.position;
//Going to the left
if(Input.GetAxis("Vertical") < 0){
if(CheckCameraPosition(homePlate, thirdBase, camPos) && CheckCameraPosition(homePlate, firstBase, camPos)){
vecZero.y = Input.GetAxis("Vertical");
}else if(!CheckCameraPosition(homePlate, thirdBase, camPos) && CheckCameraPosition(homePlate, firstBase, camPos)){
vecZero.x = Input.GetAxis("Vertical") * .66f * -1;
vecZero.y = Input.GetAxis("Vertical") * .33f;
}else if(CheckCameraPosition(homePlate, thirdBase, camPos) && !CheckCameraPosition(homePlate, firstBase, camPos)){
vecZero.x = Input.GetAxis("Vertical") * .66f;
vecZero.y = Input.GetAxis("Vertical") * .33f;
}
}
//Going to the right
if(Input.GetAxis("Vertical") > 0){
if(!CheckCameraPosition(secondBase, thirdBase, camPos) && !CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.y = Input.GetAxis("Vertical");
}else if(CheckCameraPosition(secondBase, thirdBase, camPos) && !CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.x = Input.GetAxis("Vertical") * .66f;
vecZero.y = Input.GetAxis("Vertical") * .33f;
}else if(!CheckCameraPosition(secondBase, thirdBase, camPos) && CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.x = Input.GetAxis("Vertical") * .66f * -1;
vecZero.y = Input.GetAxis("Vertical") * .33f;
}
}
//Going down
if(Input.GetAxis("Horizontal") < 0){
if(CheckCameraPosition(homePlate, thirdBase, camPos) && !CheckCameraPosition(secondBase, thirdBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal");
}else if(!CheckCameraPosition(homePlate, thirdBase, camPos) && !CheckCameraPosition(secondBase, thirdBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal") * .66f;
vecZero.y = Input.GetAxis("Horizontal") * .33f * -1;
}else if(CheckCameraPosition(homePlate, thirdBase, camPos) && CheckCameraPosition(secondBase, thirdBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal") * .66f;
vecZero.y = Input.GetAxis("Horizontal") * .33f;
}
}
//Going up
if(Input.GetAxis("Horizontal") > 0){
if(CheckCameraPosition(homePlate, firstBase, camPos) && !CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal");
}else if(CheckCameraPosition(homePlate, firstBase, camPos) && CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal") * .66f;
vecZero.y = Input.GetAxis("Horizontal") * .33f * -1;
}else if(!CheckCameraPosition(homePlate, firstBase, camPos) && !CheckCameraPosition(firstBase, secondBase, camPos)){
vecZero.x = Input.GetAxis("Horizontal") * .66f;
vecZero.y = Input.GetAxis("Horizontal") * .33f;
}
}
Vector3 newPos = new Vector3(vecZero.x, vecZero.y, 0);
transform.position += newPos * velocity * Time.deltaTime;
}
解决方案
推荐阅读
- javascript - 您如何将当前时间/总时间添加到自定义音频播放器?
- image - 如何为 JavaScript/React 应用托管图像
- html - 弹性项目不会溢出
- php - 将文本大小与图像宽度对齐
- mysql - MySQL 使用 select in or 子句的结果
- django - 基于两个输入的条件验证
- java - 如果@transactional 在类级别应用,如何拦截@transactional 参数
- javascript - How to declare condition statement in nuxt js
- java - 如何从 Spring Controller 将字节数组作为图像返回,以便浏览器可以显示它?
- javascript - 如何使用 javascript regexp 替换字符串的一部分