Day 21 | 3D蛇走迷宫AR游戏开发Part2 -角色蛇移动

昨天的文章已把场景与平面侦测做好,今天要继续说明角色蛇的移动

目录
移动机制说明
变数宣告
介面按钮设定
前进
旋转

移动机制说明

介面中会有上、下、左、右四个按纽,触控哪个按钮,角色肥遗就会往那个方向旋转然後前进。

变数宣告

在开始写肥遗的一切移动之前,要先写按钮如何控制肥遗。因为会有4个方向,所以这边写了一个class来为方向方向,这样在之後要判别方向比较方便。

static class Dir
{
    public const int Top = 0;
    public const int Right = 1;
    public const int Down = 2;
    public const int Left = 3;
    public const int no = -1;
}

再来是宣告几个变数在之後会用到的变数

储存按钮按下的方向

int inputDir = Dir.no;

储存目前的方向

int Direction = Dir.Right; 

用来储存不同按钮前进的方向

Vector3 movement;

是否要旋转

bool rotating = false; 

用来判断顺时钟逆时钟

bool turntoright = false;

累积旋转度数

float rotateangle = 0;

用来储存原本的角度

float oriAngle = 90;

介面按钮设定

先为按钮增加Trigger Event,PointDown跟PointUp,决定当按钮压下以及放开时,物件要发生的动作。根据按下的按钮更改inputDir变数。

不同按钮,不同方向旋转、移动

向上按钮来说,需要注意的是在按下这颗按钮之前,原方向可能是向右或向左,用if else去判断之前可能的方向,来决定要顺时钟还是逆时钟旋转,并且把rotating变数设为true(准备旋转)。

在不同按钮按下的函式中,改变movement变数,例如按下向上按钮,movement.z = 1f ,根据座标以此类推。

前进

在FixedUpdate中,判断如果有输入方向,就用rigibody的MovePosition函式来移动肥遗。

void FixedUpdate(){
    if(inputDir != Dir.no) {
        rb.MovePosition(rb.position + movement * movespeed * Time.fixedDeltaTime);
    }
}

旋转

也是在FixedUpdate()中进行:

  • 先判断是否需要旋转(以rotating作为flag)
  • 开始累积rotateangle
  • 用rotateangle判断有没有转超过90度了
    • 如果还没超过,就再继续判断式顺时针还是逆时针,并使用localRotation做旋转
    • 如果超过了,就判断旋转方向,旋转到由原本的角度再旋转90度,并停止旋转,归零选转角度
if (rotating){//判断有没有旋转
    rotateangle += rotatespeed * Time.deltaTime;
    
    if (rotateangle < 90f){ //还没转玩90度
        if (turntoright)
        {
            transform.localRotation = Quaternion.Euler(0, transform.localEulerAngles.y + rotatespeed * Time.deltaTime, transform.localEulerAngles.z);
        }
        else
        {
            transform.localRotation = Quaternion.Euler(0, transform.localEulerAngles.y - rotatespeed * Time.deltaTime, transform.localEulerAngles.z);
        }
    }
    else
    {
        if (turntoright)
        {
            transform.localRotation = Quaternion.Euler(0, oriAngle - 90f, transform.localEulerAngles.z);
            oriAngle = oriAngle + 90f;
        }
        else
        {
            transform.localRotation = Quaternion.Euler(0, oriAngle + 90f, transform.localEulerAngles.z);
            oriAngle = oriAngle - 90f;
        }

                rotating = false;
                rotateangle = 0;
            }
        }

以上就是比较简单的旋转以及移动罗,那肥移走迷宫的这个系列就到这边,我们明天下一个系列见~


<<:  Day 25 CSS3 < 2D转换 transform>

>>:  Python GUI - 要如何在画面上显示右键选单呢?

【心得】你今天种菜了吗? grid之路-grid的使用(3)

前言 昨天看了落落长的一大串~看得目睛花花 怎麽感觉他没有一开始的grid-template-are...

Day 8. 声明式渲染-跟Vue说Hello

开始Hello Vue前先插播一个错误调试工具- Vue.js devtools 这个chrome浏...

Day 3:AWS是什麽?30天从动漫/影视作品看AWS服务应用 -《Vivy -Fluorite Eye's Song》Part 3

Vivy几个着名事件中,与IoT最为相关的事件即是 研究员达也因为无法忘怀自己小时候的护理师AI葛蕾...

D13: 工程师太师了: 第7话

工程师太师了: 第7话 杂记: 这次的COVID-19 疫情, 究竟对我们产生了什麽影响? 很多人会...

错误处理

Golang 错误处理 首先要引入 errors 套件,大致上的用法是使用 errors.New(&...