unity里的第一视角手机声音控制器软件不见了,怎么弄出来呢?

写写停停,走走看看
Unity 之第一人称无重力控制器
最近在项目中遇到一个需求,要求软件中人物的操作为第一人称视角,并且不包含重力。要求用户可以自定义重力。
在经过一番思考之后,我想到了一种解决方案,那就是通过控制相机物体的transform属性,来对相机进行移动。至于相机的视角,我参考了unity自带的第一人称视角控制器的代码来实现。经过一番折腾是实现了,但是在测试过程中发现了一个问题。
在移动过程中,相机穿越了墙壁!!!!
就算给相机物体添加一个立方体gameobject作为父物体,并且给该父物体添加刚体,也还是没有用。墙壁的碰撞器虽然会触发碰撞事件。但是并没有作用,相机还是会穿越墙壁。这样完全不符合实际的使用需求。经过一番思考,猜测,验证。并参考了系统的FirstPersonController文件,终于找到了原因。原因是对于相机的移动,我是直接了对物体的transform值进行更改来使物体移动,这样我虽然给物体添加了刚体,但是物体并有进行物理学运动,因此物体不会遵循物理学运动现象。
知道了原因,那么就好结局了,既然是因为我对物体进行移动的操作方式有问题,那就换一种操作方式。unity有提供定义好的第一人称控制器,那我去修改一下控制器的代码,变成我需要的代码即可。
在研究了unity自带的控制器代码之后,我发现unity对于移动物体的方式是,对需要移动的物体施加力来进行移动。通过获取物体的rigidbody属性,然后通过AddForce的方式,来对物体进行移动。并且找到了控制器是通过StickToGroundHelper方法将物体固定在地板上,原理是物体向下发射一条射线,如果射线的长度不为0,物体会向下运动。那么是要将StickToGroundHelper方法去除,剩下的代码进行保留,那么就可以实现最基本的无重力第一人称视角。再通过自定义按键,给物体添加向上或者向下的力,来控制物体的向上或者向下运动,就能实现第一人称无重力控制器。
最终的实现代码如下:
private float sliderMouseValue = 0.5f;
public bool isScaleFabric = false;
public float keyboardSpeed = 2f;
[Serializable]
public class MovementSettings
public float ForwardSpeed = 2.0f;
public float BackwardSpeed = 2.0f;
public float StrafeSpeed = 2.0f;
[HideInInspector]
public float CurrentTargetSpeed = 8f;
public void UpdateDesiredTargetSpeed(Vector2 input)
if (input == Vector2.zero) return;
if (input.x & 0 || input.x & 0)
CurrentTargetSpeed = StrafeS
if (input.y & 0)
CurrentTargetSpeed = BackwardS
if (input.y & 0)
CurrentTargetSpeed = ForwardS
public MovementSettings movementSettings = new MovementSettings();
public MouseLook mouseLook = new MouseLook();
private Rigidbody m_RigidB
private void Start()
m_RigidBody = GetComponent&Rigidbody&();
mouseLook.Init(transform, cam.transform);
private void Update()
if (isOpenCameraMove && !isScaleFabric && panelS.canEdit)
if (Cursor.visible == true) {
Cursor.visible = false;
RotateView();
if (Input.GetKeyDown(KeyCode.Z) && !isScaleFabric && panelS.canEdit)
inputKeyDownZ ();
private void inputKeyDownZ () {
isOpenCameraMove = !isOpenCameraM
if (isOpenCameraMove) {
shadowAlphaTween.gameObject.SetActive (true);
shadowAlphaTween.PlayReverse ();
Cursor.visible = false;
shadowAlphaTween.PlayForward ();
StartCoroutine (HidePanel (shadowAlphaTween.gameObject));
#if UNITY_STANDALONE_WIN
SetCursorPos((int) panelS.device_width/2,(int)panelS.device_height/2);
Cursor.visible = true;
private void FixedUpdate()
if (isOpenCameraMove && target && !isScaleFabric && panelS.canEdit)
Vector2 input = GetInput();
Vector3 desiredMove = cam.transform.forward * input.y + cam.transform.right * input.x;
desiredMove.x = desiredMove.x * movementSettings.CurrentTargetS
desiredMove.y = desiredMove.y * movementSettings.CurrentTargetS
desiredMove.z = desiredMove.z * movementSettings.CurrentTargetS
if (m_RigidBody.velocity.sqrMagnitude &
(movementSettings.CurrentTargetSpeed * movementSettings.CurrentTargetSpeed))
m_RigidBody.AddForce(desiredMove, ForceMode.Impulse);
m_RigidBody.drag = 5f;
if (Input.GetKey(KeyCode.Q)) {
m_RigidBody.AddForce(new Vector3(0f, keyboardSpeed, 0f), ForceMode.Impulse);
if (Input.GetKey(KeyCode.E))
m_RigidBody.AddForce(new Vector3(0f, -keyboardSpeed, 0f), ForceMode.Impulse);
private Vector2 GetInput()
Vector2 input = new Vector2
x = CrossPlatformInputManager.GetAxis("Horizontal"),
y = CrossPlatformInputManager.GetAxis("Vertical") + Input.GetAxis("Mouse ScrollWheel") * 2
movementSettings.UpdateDesiredTargetSpeed(input);
private void RotateView()
if (Mathf.Abs (Time.timeScale) & float.Epsilon)
float oldYRotation = transform.eulerAngles.y;
mouseLook.LookRotation (transform, cam.transform);
Quaternion velRotation = Quaternion.AngleAxis (transform.eulerAngles.y - oldYRotation, Vector3.up);
m_RigidBody.velocity = velRotation * m_RigidBody.
public void changeMouseSpeed (UISlider slider) {
mouseLook.XSensitivity = 0.1f + 1.9f * slider.value;
mouseLook.YSensitivity = 0.1f + 1.9f * slider.value;
ps:如果需要更改视角的旋转速度,可以参考代码中的changeMouseSpeed方法,另外如果移动速度过快,肯能会导致unity来不及检测碰撞进行处理,最终使得物体仍然穿越墙壁。建议速度不要过大,另外也可以打开unity中的
Edit –& Project Settings –& Time 的属性面板,通过调节Fixed Timestep属性值,来缩短检测时间。
Unity中自带的第一人称与第三人称视角之间的切换问题
Unity3d 第一人称 加上之后往下掉 解决办法
Unity第一人称控制器
Unity简单的第一人称控制器编写
使用unity3d搭建简单的场景以及第一人称角色的控制
Unity第一人称控制脚本解析
Unity3D 第一人称控制器 C#脚本
没有更多推荐了,关于第一人称控制器的问题【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:88,071贴子:
关于第一人称控制器的问题收藏
大神们问一下,,,我自己写了一个第一人称控制器,但是在碰撞到物体的时候然后视角就一直在旋转,不知道怎么解决, 后来用了unity自带角色控制器,撞到东西也不视角也不旋转了,但是我发现他移动的时候一颤一颤的,怎么取消这个效果啊。。。。
转是因为你的人物有一个rigidbody,你和墙体产生摩擦了,在rigid body component把iskinematic打上对勾就好了
用CharacterController.move来移动
登录百度帐号第一人称控制器会一直往下掉,是在地面之上的【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:88,071贴子:
第一人称控制器会一直往下掉,是在地面之上的收藏
触发器关掉
地形组件(图2)上的 Is Trigger就是LS说的触发器
关闭istrigger
登录百度帐号程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之角色控制器组件研究(二十二)
Unity3D研究院之角色控制器组件研究(二十二)
围观67071次
编辑日期: 字体:
Unity3D封装了一个非常好用的组件来实现第一人称视角与第三人称视角游戏开发,我们称他为角色控制器组件,几乎不用写一行代码就可以完成一切的操作,神奇吧。使用它的方法如下,首先打开Unity游戏引擎编辑器,然后在Project视图中右键选择Import Package -& Charactr Controller(角色控制器)把它导入我们的工程中。如下图所示,第一人称与第三人称的组建已经加入Project视图中。3rd Person Controller 表示第三人称控制器,First Person Controller表示第一人称控制器。
如下图所示,我们将FirstPerson Controller拖拽入Hierarchy(层次视图)中。由于角色控制器是具有一定物理引擎的,所以一定要将它放在地形或面对象之上,否则当它接收物理效果时发现地面没有东西支撑它,它就会掉下去。然后运行游戏你就会发现和CS中的第一人称效果非常相像, W、S、A、D移动人物行走,移动鼠标更改行走的方向,空格键人物会跳跃。
第一人称视角的实现原理是在游戏场景中创建了一个胶囊体的游戏对象,并且给胶囊体对象身上绑定了一个摄像机,摄像机对象如下图所示,它绑定在”Person Controller”中。这时场景中默认的摄像机就会失效,可以直接删掉默认的摄像机。通过按键控制这个胶囊体移动,通过鼠标修改胶囊体的朝向,此时你就会发现第一人称视角已经完全实现,目前为止我们不需要编写一行代码。目前场景中的天空盒子我是使用skyBox组件绑定在摄像机中,因为第一人称视角的摄像机对象在”Person Controller”中,所以需要将SkyBox组件绑定在这个摄像机中,如果绑定在默认摄像机中那么你将不会看到天空的效果。
(点击图片查看大图)
下面我们在看看第三人称视角,如下图所示,在Project视图中将3rd Person Controller拖拽入Hierarchy视图中。第三人称视角需要使用我们原有的摄像机,如果刚刚将摄像机的删掉的话。在Hierarchy视图中点击Creat-&Camera 即可。然后选择摄像机,在右侧Inspector视图中设置它的tag为MainCamera,如下图所示。最后在Hierarchy视图中选择3rd Person Controller,在右侧Inspector视图中将Third Person Camera 脚本的 Camera Transform 变量绑定上刚刚创建的主摄像机,此时运行游戏后以第三人称视角移动主角行走与跳跃,摄像机永远都会在跟随在后面除非修改角色控制器组件中默认提供的源码,源码都在右侧监测面板视图中直接点开就可以查看。
(点击图片查看大图)
下面我们学习角色控制器组件在其它模型之间的应用。首先在Hierarchy视图中创建两个Cube(立方体对象) 命名为:Cube0(发出碰撞的对象)Cube1(接收碰撞的对象),然后在Hierarchy视图中选择Cube0对象,接着Unity导航菜单栏中选择Component(组件)-Character-&选择任意一个角色控制属性。 补充一句,角色控制器组件一定要在Project视图中导入,否则这里将无法绑定组件。角色控制器组件因为与碰撞组件相互冲突,所以添加角色控制器组建后Collider组件就会消失。下面我们实现一段简单得代码,使用添加过角色控制器组件的Cube0 去碰撞未添加角色控制器组件的Cube1。
123456789101112131415161718192021222324252627282930313233343536373839404142
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour {& //主动碰撞的对象名称 string castName = null;& //接收碰撞的对象名称 string receiveName = null;& void OnGUI () &&&&{&
if(castName!= null && receiveName !=null)
//设置显示的颜色为黑色
GUI.color = Color.black;
&&&&//显示主动碰撞的对象 与接收碰撞的对象名称 &&&& GUI.Label(new Rect(100,100,200,30),"主动碰撞的对象名称"+castName); &&&& GUI.Label(new Rect(100,200,200,30),"接收碰撞的对象名称"+receiveName);
} }& //角色控制器组件在与具有Collider组件对象之间的碰撞 void OnControllerColliderHit(ControllerColliderHit hit) {&
//得到接收碰撞名称
GameObject hitObject = hit.collider.gameObject;&
//当它不是地面时间
if(!hitObject.name.Equals("Terrain"))
//得到主动碰撞的对象 与接收碰撞的对象名称
castName = gameObject.name;
receiveName = hitObject.name;
将上面这段代码绑定在Cube0中,运行游戏后W、A、S、D按键来控制Cube1立方体移动。当Cube0与Cube1发生碰撞时,程序将进入方法OnControllerColliderHit(),通过参数就可以得到接收碰撞的游戏对象也就是Cube1对象,而gameObject就是当前主动发生碰撞的Cube1。如下图所示,当两个立方体碰撞时使用GUI已经将碰撞的信息打印出来。
接着我在说说刚体组件,默认在Unity中创建的模型是不具备接收物理引擎的,除非给模型添加刚体组件或角色控制器组件。我们先说说刚体,还用奋斗的小鸟来举例子。发射小鸟以后,小鸟以一个抛物线轨迹去撞击物体,发生碰撞后被碰撞的物体会根据小鸟撞击的角度以及力度发生不同的物理效果,并且几乎是完全模拟真实的物理引擎。但是这种物理引擎的效果不能绑定在比如RPG游戏的主角身上。原因很简单,因为刚体所添加的物理引擎太过于真实以至于会影响用户的对主角的操作,举个例子比如用户在控制主角移动时他碰撞到质量较大的物体,根据真实的物理引擎会被这个物体的反弹力把主角反弹回原位。但是这个是不符合逻辑的,因为刚体组件太过于物理话了,所以我们需要给主角添加角色控制器组件,它操作起来比较灵活,更容易让我们操作主角。
下面我们给Cube1对象绑定刚体组件,选择Cube1对象然后在导航菜单栏中选择Component-&physics -&Rigidbody(刚体)。我们看看下面这段代码,使用添加了角色控制器组件的Cube0 去碰撞添加刚体组件的Cube1,当他生碰撞时计算一下Cube0碰撞Cube1时的碰撞角度向量,然后通过刚体向他施加一个力把它推开。
123456789101112131415161718192021222324
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour {& //角色控制器组件在与具有Collider组件对象之间的碰撞 void OnControllerColliderHit(ControllerColliderHit hit) {&
//判断碰撞的对象是否具备刚体组件
GameObject hitObject = hit.collider.gameObject;
Rigidbody rigidbody = hitObject.rigidbody;
if(rigidbody != null && !rigidbody.isKinematic)
//地面也具备刚体组件,这里判断一下
if(!hitObject.name.Equals("Terrain") )
rigidbody.AddForce(new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z) * 10);
也可以将同样的脚本直接绑定在第三人称的角色控制器组件中。如下图所示,主角移动将周围的箱子都推开了。
总的来说角色控制器组件适用于 既需要感应物理引擎的支持但是又不能完全依赖与物理引擎,需要自己代码去编写一些东西的模型,所以非常适合游戏中主角对象的使用。雨松MOMO祝大家学习愉快,哇咔咔。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!Unity3D镜头为第一人称控制器子物体,镜头抖动怎么解决。_百度知道
Unity3D镜头为第一人称控制器子物体,镜头抖动怎么解决。
怎么解决...
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
你的回答被采纳后将获得:
系统奖励15(财富值+成长值)+难题奖励30(财富值+成长值)
热心网友知道合伙人
貌似就是使用translate方法实现的吧,
圣典中没有translate方法
能告诉下怎么用么?
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 unity模组管理器百度云 的文章

 

随机推荐