自动寻路可以实现角色自动到任意的地方,也可以上楼,可我希望通过方向键来实现角色的移动和上楼梯。可是不同的楼梯有不同的台阶高度,若给他设定一个固定的值。那么使用起来不方便,而且在判断上楼还是下楼时比较难,如何让角色在y轴上的移动随着下一步的高度来改变呢?

若是在复杂的地形中,或许我们可以用Terrain.activeTerrain.SampleHeight(transform.position);这个函数。

public class example : MonoBehaviour {
 void LateUpdate() {transform.position.y = Terrain.activeTerrain.SampleHeight(transform.position);}
}

然而楼梯等就不是地形里的了,要获取其他的物体的为位置,我们可以使用射线Ray。

origin  起点;

direction 方向;

GetPoint(float distance) 获取点(返回沿着射线在distance距离单位的点)

还有RaycastHit 光线碰撞器。用来获取碰撞后的信息反馈。

一般使用的是这个函数static function Raycast (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool

若以碰撞提产生量交叉碰撞,返回true,或则返回false。

我们在使用时可以Physics.Raycast(Ray ray ,out  hit);       用一个out变量来将它们都带回。

好了,接下来就是写移动的代码了,,我用的是第一人称角色,所以前进键来判断,,目前尚未添加后退键的判断代码,总之,那也是同理得的啦。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class controlmove : MonoBehaviour {
public float speed;
public Vector3 RayOrigin;
Ray ray;
// Use this for initialization
void Start () {
speed = 1.0f;
}
// Update is called once per frame
void Update () {
RayOrigin = new Vector3 (this.transform.position.x, this.transform.position.y , this.transform.position.z )+this.transform.up*2+this.transform.forward*speed;
ray.origin = RayOrigin;
ray.direction = new Vector3 (0, -1, 0);
RaycastHit hit;
if (Physics.Raycast (ray, out hit)) {
Debug.DrawLine (ray.origin, hit.point, Color.red);
}
if (Input.GetKey (KeyCode.UpArrow)) {
Debug.Log (hit.point);
this.transform.Translate (0, -this.transform.position.y + hit.point.y, Time.deltaTime * speed);
}
if (Input.GetKey (KeyCode.DownArrow))
this.transform.Translate (0, 0, -Time.deltaTime);
if (Input.GetKey (KeyCode.LeftArrow))
this.transform.Rotate (0, -1, 0);
if(Input.GetKey(KeyCode.RightArrow))
this.transform.Rotate(0,1,0);
}
}
因为把ray用红色画出来了,因此我们可以清晰的看到有红线,并在碰撞到楼梯时射线结束。

这里要注意的问题是楼梯等要加上碰撞体,同时还要注意碰撞体的类型!!!

还有就是在确定rayorigin的时候,我们要让射线在我角色的正前方,不是简单的

RayOrigin = new Vector3 (this.transform.position.x, this.transform.position.y +2, this.transform.position.z +1);

不然得到的是一个世界坐标下的方向移动,在角色的转向过程中,不一定会在角色的正前方。应该用下面这个函数

RayOrigin = new Vector3 (this.transform.position.x, this.transform.position.y , this.transform.position.z )+this.transform.up*2+this.transform.forward*speed;

这样就完成了。

unity用方向键来控制角色上楼梯相关推荐

  1. Unity开发备忘录000028:Bolt无代码做游戏——控制角色行走

    1. 添加角色 (1)添加地面碰撞器 在添加角色之前,先添加一个地面碰撞器,否则添加UnityChan角色后,由于重力的作用,她将坠入深渊. 创建一个空对象,更名为CollierOnGround,为其 ...

  2. python方向键控制角色_用python和pygame游戏编程入门-控制角色移动

    在上一节中我们知道了事件,以及如何捕捉键盘事件进行响应,本届我们结合第一节何上一节的内容,做一个用键盘控制角色移动的功能,代码如下: #!/usr/bin/env python #指定图像文件名称 b ...

  3. (完结)Unity游戏开发——新发教你做游戏(七):Animator控制角色动画播放

    文章目录 一.前言 二.Animator状态机组织 三.过渡条件 四.用代码设置过渡条件,触发动画播放 五.CharacterAniLogic.cs完整代码 一.前言 文章列表 Unity游戏开发-- ...

  4. unity碰撞检测函数,碰撞信息获取,触发检测,使用粒子系统创建火焰,创建动画(火光闪烁),导航系统,通过导航系统控制人物移动,控制摄像机的跟随,控制角色动画播放

    碰撞检测函数 private void OnCollisionEnter(Collision collision){print("OnCollisonEnter");}privat ...

  5. Unity控制角色移动方式

    Unity控制角色移动方式* 动态"是游戏最基本的特性之一,游戏只有动起来才能吸引人.今天主要和大家分享一下我平时通过unity控制主角移动的方式. 1 直接更改角色的transform.p ...

  6. qt ui界面无法移动控件_使用qt 键盘上的方向键只能控制ui界面上的按钮选择,不能实现我设定的功能...

    已结贴√ 问题点数:20 回复次数:2 使用qt 键盘上的方向键只能控制ui界面上的按钮选择,不能实现我设定的功能 我做的是一个贪吃蛇游戏,现在我想实现的功能是:按下键盘上的上下左右箭头的方向按键时, ...

  7. Unity UGUI通过摇杆joystick 控制角色移动 标准的第三人称视角手游-左侧控制移动,右侧控制视角和方向

    Unity UGUI通过摇杆joystick 控制角色移动 标准的第三人称视角手游-左侧控制移动,右侧控制视角和方向 效果图显示 附上demo下载地址 备注:资源是URP的,普通平台修改资源材质即可 ...

  8. 【Unity3D日常开发】自动寻路系统Navigation实现人物上楼梯、走斜坡、攀爬、跳跃

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 参考文章:列表 Unity3D深入浅出 - 导航网格自动寻路(Navigat ...

  9. 【Unity3D】自动寻路系统Navigation实现人物上楼梯、走斜坡、攀爬、跳跃

    @toc 参考文章:列表 Unity3D深入浅出 - 导航网格自动寻路(Navigation Mesh) unity3D--自带寻路Navmesh入门教程(二) Unity3D自动寻路系统Naviga ...

最新文章

  1. 计算机房一般在办公楼建设吗,写字楼大厦机房建设技术方案.doc
  2. 牛客练习赛61 E 相似的子串(二分+哈希)难度⭐⭐⭐
  3. 通过Attached Property给控件绑定Command(二)
  4. iOS 查看崩溃日志
  5. 电子商务和ERP的关系主要体现
  6. SQLserver单表数据导入导出
  7. matlab fill 渐变,Matlab的渐变色填充(一)
  8. 在 Eclipse 3.5中在线安装SVN插件
  9. django-models类索引外键时候的related_name属性作用
  10. 搭建负载均衡器nginx_为什么要使用NGINX作为负载均衡器?
  11. 7000字整理: 全网最详细Pandas合并数据集操作总结
  12. 蓝桥杯 基础练习 Huffuman树
  13. 重定向ISA日志到SQL2000
  14. 领秀加速器软件介绍及功能介绍
  15. android获取ssid,Android系绳 – 获取当前的SSID
  16. 【第一组】第九次冲刺例会纪要
  17. xmlhttp.readyState的值及解释
  18. 游码编程之Python代码应用
  19. arduino leonardo 入门
  20. Java项目:毕业设计管理系统(java+SSM+jsp+mysql+maven)

热门文章

  1. 复习-数据结构之线性表
  2. 机房动环系统主要方面
  3. 文化基因算法(Memetic Algorithm,MA)
  4. ubuntu系统简单尝试
  5. linux卸载欧朋浏览器,欧朋Opera Linux浏览器下载
  6. ubuntu开机出现started gnome Display manager等错误的方法
  7. upload-iabs1-5关
  8. 服装鞋帽吊牌条码如果用吉度PDA扫码出入库盘点
  9. crc循环冗余校验 php,crc 循环冗余校验
  10. 大功率分流电阻器产品阵容进一步扩大,助力大功率应用小型化