unity3d物体移动代码中有移动物体到一个点的函数吗

 上传我的文档
 下载
 收藏
粉丝量:54
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
在Unity3D中实现点击地面物体移动到指定地点
下载积分:1000
内容提示:在Unity3D中实现点击地面物体移动到指定地点
文档格式:DOC|
浏览次数:416|
上传日期: 11:37:27|
文档星级:
全文阅读已结束,如果下载本文需要使用
 1000 积分
下载此文档
该用户还上传了这些文档
在Unity3D中实现点击地面物体移动到指定地点
关注微信公众号13845人阅读
Unity3D(8)
在游戏开发中,游戏物体的移动是最基本的,如果连物体都移动不起来,那就不用说玩游戏了。
下面记录了自己在开发中实现的物体移动,不同项目可能有不同的物体移动实现,也有很多种不同的物体移动实现,文章会持续更新。
1.rigidbody.MovePosition()控制物体上下左右移动(简单好用)
// Update is called once per frame
void Update()
//控制移动
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rigidbody.MovePosition(transform.position + new Vector3(h, 0, v) * speed * Time.deltaTime);
2.transform.Translate();上下左右移动
using UnityE
using System.C
public class Move : MonoBehaviour
public float speed = 5;
// Use this for initialization
void Start()
transform = this.GetComponent&Transform&();
// Update is called once per frame
void Update()
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
transform.Translate(new Vector3(h, 0, v) * speed * Time.deltaTime);
3.点击鼠标,物体移动到鼠标位置(2D,transform.position)
if (isMouseDown && GameManager._instance.gameState == GameState.Runing)
if (lastMousePosition != Vector3.zero)
//Camera.main.ScreenToWorldPoint(Input.mousePosition)
Vector3 offest = Camera.main.ScreenToWorldPoint(Input.mousePosition) - lastMouseP//位移
transform.position = transform.position +
checkPosition();
lastMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
4.rigidbody2D.AddForce();(2D游戏添加力左右移动物体,忍者跑酷)
void Update()
if (isSlide == false)
float h = Input.GetAxis("Horizontal");
Vector2 velocity = rigidbody2D.
if (h & 0.05f)
rigidbody2D.AddForce(Vector2.right * force_move);
else if (h & -0.05f)
rigidbody2D.AddForce(-Vector2.right * force_move);
5.点击鼠标,物体移动到鼠标的位置(3D,Vector3.MoveToWards()函数,BeatPlane飞机大战)
实现代码:
protected Transform _
protected Vector3 targetP//目标位置
// Use this for initialization
void Start()
_transform = this.
targetPos = this._transform.
void MoveTo()
if (Input.GetMouseButton(0))
//获得鼠标屏幕位置
Vector3 mousePos = Input.mouseP
//将屏幕位置转为射线
Ray ray = Camera.main.ScreenPointToRay(mousePos);
//用来记录射线碰撞记录
RaycastHit hitI
//产生射线
bool isCast = Physics.Raycast(ray, out hitInfo, 1000, inputMask);
if (isCast)
//如果射中目标,记录射线碰撞点
targetPos = hitInfo.
//使用Vector3提供的MoveTowards函数,获得朝目标移动的位置
Vector3 pos = Vector3.MoveTowards(this._transform.position, targetPos, speed * Time.deltaTime);
//更新当前位置
this._transform.position =
游戏运行时,点击鼠标,物体就会移动到鼠标所点击的位置。
6.键盘WSAD控制物体的上下左右移动(这个比较复杂。。)
void Control()
//获取鼠标移动距离
float rh = Input.GetAxis("Mouse X");
float rv = Input.GetAxis("Mouse Y");
// 旋转摄像机
m_camRot.x -=
m_camRot.y +=
m_camTransform.eulerAngles = m_camR
// 使主角的面向方向与摄像机一致
Vector3 camrot = m_camTransform.eulerA
camrot.x = 0; camrot.z = 0;
m_transform.eulerAngles =
// 定义3个值控制移动
float xm = 0, ym = 0, zm = 0;
// 重力运动
ym -= m_gravity * Time.deltaT
//按键盘W向上移动
if (Input.GetKey(KeyCode.W))
zm += m_movSpeed * Time.deltaT
else if (Input.GetKey(KeyCode.S))//按键盘S向下移动
zm -= m_movSpeed * Time.deltaT
if (Input.GetKey(KeyCode.A))//按键盘A向左移动
xm -= m_movSpeed * Time.deltaT
else if (Input.GetKey(KeyCode.D))//按键盘D向右移动
xm += m_movSpeed * Time.deltaT
}&pre name="code" class="csharp"&}首先还是先声明自己是比较笨的一个人,总是找不到高效的学习方法,目前自己学习Unity3D的方式主要是两种,一种是直接看高质量的源码,另一种是光看不行还要自己动手,自己写一些有代表性的小程序,这也是本文的由来。
诚然,现在已经不是Unity3D发展的黄金期了,很多知识点已经有很多朋友总结分享了,但由于Unity3D的客观性就是依赖插件很厉害,这样就会照成插件满天飞,通用性不强,还有过时的风险,还有就是网上很多朋友发的帖子很多并不是学习总结,只是对于Unity3D IDE的使用及一些API的罗列,或者是一些游戏Demo的完整教程。自己一直想从另一个角度来学习一下,也就是单纯从游戏的角度(我们常说的业务逻辑的角度),其实以前很多VC游戏教程都是这种思路,就是从一个很小的功能开始学,逐个知识点积累最后完成一个相对复杂完整的Demo程序。所以本文就从最小的让物体动起来开始。
文章的视角基本着眼的是从简单到复杂功能的学习理解,所以是主要是基于2D的,也就是从Untiy2D开始,同时也会穿插一些3D部分,
所以最好使用具有Unity2D功能的Unity3D客户端,好像是4.3以后吧
效果图镇楼
需求描述和分析
本章的需求很简单,就是&通过在屏幕中点击鼠标,在2d视图中控制物体进行移动&。在别的平台和引擎中简直是Hello world级别的需求在Unity3d中却变得有些棘手了,主要有几个问题困扰着我,
1、IO输入是怎么样的;
2、鼠标事件是如何接收的;
3、移动动画是如何实现的;
&原理很简单,现实很残酷&,Unity3d的开放性造成了所谓的插件和库很多,显得凌乱。这里还是按照自己的惯性思维来了,按照别的平台的教程,
A、首先要有一个容器,
B、在容器上放置需要移动的精灵,
C、通过容器接收鼠标事件,
D、事件驱动精灵移动
这里UGui中采用容器的概念(或者我还不知道别的库也有),所以先在UGui中实现,
第一步,加一个Panel对象
第二步,导入一个精灵的图片资源
第三步,加一个2d的Image对象,设置其sprite为刚才导入的图片资源
第四步,给Panel对象绑定一个脚本,PanelController,
加图资源后
具体代码如下
using UnityE
using System.C
using UnityEngine.EventS
public class PanelController:
MonoBehaviour , IPointerClickHandler
private Transform childPlayT
private Transform parentCanvasT
// Use this for initialization
void Start ()
//获得Image的Transform
childPlayTransform = transform.Find("Image");
parentCanvasTransform = transform.
// Update is called once per frame
void Update () {
public void OnPointerClick(PointerEventData eventData)
Debug.Log(string.Format("x:{0},y:{1}", eventData.position.x, eventData.position.y));
Debug.Log(string.Format("button x:{0},y:{1}", childPlayTransform.localPosition.x, childPlayTransform.localPosition.y));
Vector2 localP
//在矩形范围内检测,全局鼠标点击点,到local点的转换
RectTransformUtility.ScreenPointToLocalPointInRectangle(transform as RectTransform, eventData.position,
eventData.enterEventCamera, out localPoint);
childPlayTransform.localPosition = localP
代码虽然少,但是核心的知识点就是世界坐标、相机坐标和局部坐标的转换也就是下面的这个函数
Does the RectTransform contain the screen point as seen from the given camera?
The RectTransform to test with.
screenPoint:
The screen point to test.
The camera from which the test is performed from.
// 返回结果:
True if the point is inside the rectangle.
public static bool RectangleContainsScreenPoint(RectTransform rect, Vector2 screenPoint, Camera cam);
public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint);
虽然功能很少,但是也有几个知识点,一个是Unity3d的坐标系统,一个是坐标转换的基础知识,一个是Unity3d Gui的事件处理方式,特此记录。功能上有点小缺陷就是精灵的移动是瞬移的,也就是鼠标指到哪里移动到哪里(确实我也没有看出有什么不平滑),留到下篇继续吧。
阅读(...) 评论()怎样让一个物体在一定的范围内自由随即的移动呀?【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:84,200贴子:
怎样让一个物体在一定的范围内自由随即的移动呀?收藏
就是当物体自己移动到范围的边上时能够往反方向移动
用随机函数,在范围内取一个点,移动到那后在取新的点? 如果你要每次都移动到边界,那就在边界上随机取点,即xyz至少有一个值在边界上,另外两个随机。比如一个边界范围B Vector3 c = bounds.Vector3 s = bounds.比如随机点float x = Random.Range(c.x - s.x * 0.5f, c.x - s.x * 0.5f);float y = Random.Range(c.y - s.y * 0.5f, c.y - s.y * 0.5f);float z = Random.Range(c.z - s.z * 0.5f, c.z - s.z * 0.5f);Vector3 point = new Vector3(x, y, z);是这样不?
你是想要一种啥效果啊?一个点在一个放盒子里乱飞,还是走直线碰到边就折射?看你代码是一直水平走,但垂直一直在抖动。
那可以这样,随机计算一个方向向量Vector3 direction =然后tansform.Translate(direction);当接触边界时,如果要取反就取反就是了;如果要随机反射就在随机计算一个direction。这样每帧判断position在不在范围里就行了
你这肯定都是些Update里的把?Update每帧执行,Translate()是移动的代码,你这Translate只有if成立才执行,所以没到边界就不会移动呀。所以你在if里计算好direction拿出来存到一个成员变量里,每帧都Translate这个direction*speed就保证他一直在移动了。
给设置场景外层设置碰撞 然后碰到的物体 转向碰撞点的法线的反射方向
初学者路过。。不明觉厉。。
楼主还有源文件吗
登录百度帐号他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 unity3d物体移动脚本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信