Unity 3D 中自动寻路 和 跟随转向 探析
这里主要讲三个函数 , 一个自动跟随函数 和 两个指向旋转函数 , 这三个函数在游戏角色创建过程中会经常用到:
这个是跟随函数 和 欧拉角旋转函数
public class GensuiZhixiang : MonoBehaviour {
//公共属性
//定义跟随主体的Transform
Transform m_transform;
//定义被跟随(指向)物体的Transform
public Transform target;
//跟随类
//定义跟随主体的移动速度
float m_speed = 10f;
//指向类
//定义跟随主体的转向角度
float m_rotSpeed = 120f;
// Use this for initialization
void Start ()
{
//获取自身Transform
m_transform = this.transform;
}
// Update is called once per frame
void Update ()
{
//调用跟随函数
Follow();
//调用指向函数
LookAt();
}
//跟随函数
void Follow()
{
//定义跟随主体原来的位置(还没有跟随移动)
Vector3 oldPosition = m_transform.position;
//定义被跟随物体的的位置
Vector3 targetPosition = target.position;
//得到XYZ轴上的向量
float x = Mathf.MoveTowards(oldPosition.x, targetPosition.x, m_speed * Time.deltaTime);
float y = Mathf.MoveTowards(oldPosition.y, targetPosition.y, m_speed * Time.deltaTime);
float z = Mathf.MoveTowards(oldPosition.z, targetPosition.z, m_speed * Time.deltaTime);
//把得到的向量赋给跟随主体 实现跟随
m_transform.position = new Vector3(x,y,z);
}
//指向函数
void LookAt()
{
//定义指向主体原来的角度(还没有旋转)
Vector3 oldOEuler = m_transform.eulerAngles;
//指向主体坐标 转向 被指向物体
m_transform.LookAt(target.transform);
//得到面向物体的欧拉角(只需要XY就能实现指向了)
float eulerX = Mathf.MoveTowardsAngle(oldOEuler.x, m_transform.eulerAngles.x, m_rotSpeed * Time.deltaTime);
float eulerY = Mathf.MoveTowardsAngle(oldOEuler.y, m_transform.eulerAngles.y, m_rotSpeed * Time.deltaTime);
//把得到的旋转量赋给主体 实现指向
m_transform.eulerAngles = new Vector3(eulerX, eulerY, 0);
}
}
这个是 四元数旋转函数
public class QuaternionLookat : MonoBehaviour {
//定义被指向主体的Transform
Transform m_transform;
//定义被指向物体的Transform
public Transform target;
// Use this for initialization
void Start ()
{
//初始化给主体赋Transform
m_transform = this.transform;
}
// Update is called once per frame
void Update ()
{
//调用旋转函数
QuaterLook();
}
//四元数旋转函数
void QuaterLook()
{
//定义一个三维变量 用来表示从本体 到 客体的向量
Vector3 pos = target.position - m_transform.position;
//用四元数的LookRotation() 获得转向的四元数
Quaternion m_rotation = Quaternion.LookRotation(pos);
//把得到的旋转量 赋给旋转本体 实现指向旋转 (注意这里的.localRotation 而不是.rotation 因为前者能实现旋转 后者不行)
m_transform.localRotation = m_rotation;
}
}
欧拉角旋转函数 和 四元数旋转函数 都能实现实时指向旋转 但是四元数的效果更好 细节也更细腻
Unity 3D 中自动寻路 和 跟随转向 探析的更多相关文章
- 在Unity 3D中加入Image图片
在Unity 3D中加入Image图片,我在刚开始是加不进去的,为什么呢?因为没有图片,图如下: 原因就是我们没有把图片设置为Script,图片的格式还是默认的那个,这只能作为贴图使用.我们将图片进行 ...
- Unity 3D中的阴影设置
在Unity 3D中,经常需要用到光照阴影,即Directional Light的Shadow,Shadow分为Hard Shadow和Soft Shadow.区别是Soft Shadow的阴影边缘比 ...
- Unity 3D中不得不说的yield协程与消息传递
1. 协程 在Unity 3D中,我们刚开始写脚本的时候肯定会遇到类似下面这样的需求:每隔3秒发射一个烟花.怪物死亡后20秒再复活之类的.刚开始的时候喜欢把这些东西都塞到Update里面去,就像下面这 ...
- Unity 3d中Shader是什么,可以吃吗?
众所周知,Unity3d是一款跨平台非常广的游戏引擎,上手容易,界面友好,集成功能众多,是目前开发手游的主流引擎.本人有幸使用Unity 3d进行开发已一年多时间,已领略了这歀引擎的强大之处. 编写s ...
- Unity 3D中的内存管理
本文欢迎转载,但烦请保留此行出处信息:http://www.onevcat.com/2012/11/memory-in-unity3d/ Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备 ...
- Unity 3D中的菜单项
1.File菜单:主要是包含项目和场景的创建.保存以及输出等功能.2.Edit(编辑)菜单:只要包括对场景进行一系列的编辑以及环境设置操作等命令.3.Assets(资源)菜单:掌握资源在Unity中的 ...
- Unity 3D中ToLua-UGUI使用说明、导入Unity流程、制作登陆界面
ToLua制作登录界面 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 请支持大神开发者:骏擎CP,蒙哥等奔 ...
- 3D max模型导入unity 3D中注意事项
一.单位,比例统一 在建模型前先设置好单位,在同一场景中会用到的模型的单位设置必须一样,模型与模型之间的比例要正确,和程序的导入单位一致,即便到程序需要缩放也可以统一调整缩放比例.统一单位为米. ...
- Unity 3D中C#的性能优化小陷阱
本篇内容主要来自Unity官方手册: 一般性能优化 一些地方为本人瞎编杜撰,请酌情参考.如有错误,欢迎指出. Unity里C#编程虽然既简单还很爽,但是性能小陷阱还不少.我总强迫自己让代码最优,因此很 ...
随机推荐
- VC基于消息的异步套接字
用WSAStartup,需要在StdAfx.h头文件中需要声明 #include #pragma comment(lib,"WS2_32.lib") 用AfxSocket ...
- 21个高质量的Swift开源iOS App
原文:21 Amazing Open Source iOS Apps Written in Swift 对Swift初学者来说,学习开源项目,阅读源码是个不错的方法.在这篇文章中,基于对代码质量和排名 ...
- Tomcat 集群模式下 Session 更新 Bug (redis memcached 及tomcat自已的集群)
从 excel 中导入数据入系统,我们用的是先上传文件至服务器再分析所上传的文件逐行导入. 就是执行了一循环,在当前循环位置标识一下客户端就知道执行的进度了,以前的方式 是用 session.setA ...
- puppy-language
puppy language是一种解释型的结构化脚本语言. 项目地址: https://github.com/zlvb/PuppyLanguage 因为一直很忙,有段时间没去更新了,不过功能已经比较完 ...
- Java int to String互转
Integer.toString Integer.parseInt(lAyaNums);
- Ay.Framework.WPF 2.0建立项目到底有多快
2015-3-31 今天我已经优化了很多地方,让客户使用起来几乎是傻瓜式使用了,废话不多说,我们开始吧. 默认的我提供了一些图片,但是也只占用了8M多,2.0版本目前总共有45M左右大小,毕竟包含了f ...
- .NET通过async/await实现并行
如果可以并行可以大大提高性能,但在我们的使用中,不可能全是并行的也是要有线行操作,所以我们需要在业务逻辑层进行并行操作的护展: 数据访问层不变还是以前一样如下: public class UserDA ...
- 2.C#中通过委托Func消除重复代码
阅读目录 一:重复的代码 二:C#中通过委托Func消除重复代码 一:重复代码 public class Persion { public string Name { get; set; } ...
- 【Cocos2d-Js基础教学 入门目录】
本教程视地址频在: 九秒课堂 完全免费 从接触Cocos2dx-Js以来,它的绽放的绚丽让我无法不对它喜欢.我觉得Js在不断带给我们惊喜:在开发过程中,会大大提升我们对原型开发的利用率,使用Js语言做 ...
- A successful Git branching model
这个模型比较全,收藏一下,原文: http://nvie.com/posts/a-successful-git-branching-model/ 关于这个模型中的hotfix只适应最新的Release ...