Unity 模型播放动画时会穿过其他水流推动物体模型,怎么解决?

unity3d 点击物体播放动画_百度知道
unity3d 点击物体播放动画
多个装配模型,有安装的顺序,点击第一个物体完成动作后,再点击第二个物体,第二个物体再做运动,动作顺序在max中做好,想直接调用,有没有源代码能直接用的传我邮箱吧?求各位大神帮忙啊~邮箱:
我有更好的答案
不明白,你是要点中哪个物体就播放它的动画吗?
就像装配螺丝一样,有拆装的顺序的,只有点对了那个螺丝,那个螺丝才会动。
那就在碰撞物体时判断当前的步骤是什么,如果是这个步骤的话就播放它的动画,然后步骤加1.
能不能把可以直接用的代码给我呀?
你是哪个不会?是思路还是选择物体代码还是播放动画?
选择物体代码,一个物体的多个零件的选择。
选择物体代码if (Input.GetMouseButtonDown(0))
var screenpos = Input.mouseP
var ray = Camera.main.ScreenPointToRay(screenpos);
if (Physics.Raycast(ray, out hitinfo))
//取hitinfo的碰撞物就是那个选择的物体。
}每个零件都应该有个碰撞体。
为您推荐:
其他类似问题
您可能关注的内容
unity3d的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Unity3D动画播放完毕后,为什么物体状体会默认回到之前的状态_百度知道
Unity3D动画播放完毕后,为什么物体状体会默认回到之前的状态
例如我做了个开门动画,但是每次播放完后,门的状态会自动回到关闭状态,怎么才能让门定在开门动画最后一帧的状态?
我有更好的答案
我做的是窗帘的开和关:animOpenCurtain=GameObject.Find (&sh&).GetComponent&Animator&();AnimatorStateInfo animatorinfo = animOpenCurtain.GetCurrentAnimatorStateInfo (0); if (animatorinfo.normalizedTime & 1) {animOpenCurtain.speed=-1f;
animOpenCurtain.Play (&Open&, 0, 1f);
animOpenCurtain.speed=1f;
animOpenCurtain.Play (&Open&, 0, 0f);
}“Open”是状态机的窗帘开的动画;还要把动画循环勾选去掉,用代码控制就行了;大概思路是这样,不行的话把上面animOpenCurtain.Play (&Open&, 0, 0f)里的参数改改试试。
采纳率:100%
实现不了,animation默认就是这样
为您推荐:
其他类似问题
unity3d的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。51CTO旗下网站
Unity3D 游戏引擎之FBX模型载入与人物行走动画播放
3D 世界中自定义模型的使用恐怕是重中之重,因为系统自身提供的模型肯定是无法满足GD对游戏的策划,所以为了让游戏更加绚丽,我们须要调用美术制作的精品模型与动画,本章将带领大家学习Unity3D中模型的载入与动画的播放。
作者:佚名来源:| 09:00
由于作者手头上没有现成的模型,所以我将在Unity3D 官网中下载官方提供的游戏DEMO 中的模型来使用。另外官方提供了很多Unity3D 游戏DEMO,与详细的文档。可以帮助我们学习Unity.有兴趣的盆友可以去看看哈。
下载页面:http://unity3d.com/support/resources/&
本章博文的目的是利用上一章介绍的游戏摇杆来控制人物模型的移动,与行走动画的播放。
如上图所示Create中的文件夹male中存放着模型动画与贴图等,这个应该是美术提供给我们的。然后将整个male用鼠标拖动到左侧3D世界中,通过移动,旋转,缩放将人物模型放置在一个理想的位置。右侧红框内设置模型动画的属性。
& & & idle1& 该模型默认动画名称为idle1
Animations
& & & size & 该模型动画的数量
& & & Element 该模型的动画名称
Play Automatically 是否自动播放
Animation Physics 是否设置该模型物理碰撞
Animation Only if Visable 是否设置该模型仅自己显示
给该模型绑定一个脚本Controller.cs 用来接收摇杆返回的信息更新模型动画。
Controller.cs
[代码]c#/cpp/oc代码:
using UnityE&
using System.C&
public class Controller : MonoBehaviour {&
&&&&//人物的行走方向状态&
&&&&public const int HERO_UP= 0;&
&&&&public const int HERO_RIGHT= 1;&
&&&&public const int HERO_DOWN= 2;&
&&&&public const int HERO_LEFT= 3;&
&&&&//人物当前行走方向状态&
&&&&public int state = 0;&
&&&&//备份上一次人物当前行走方向状态&
&&&&//这里暂时没有用到&
&&&&public int backState = 0;&
&&&&//游戏摇杆对象&
&&&&public MPJoystick moveJ&&&
&&&&//这个方法只调用一次,在Start方法之前调用&
&&&&public void Awake() {&
&&&&&&&&&&&
&&&&//这个方法只调用一次,在Awake方法之后调用&
&&&&void Start () {&
&&&&&&&&state = HERO_DOWN;&
&&&&void Update () {&
&&&&//获取摇杆控制的方向数据 上一章有详细介绍&&&
&&&&float touchKey_x =& moveJoystick.position.x;&&&
&&&&float touchKey_y =& moveJoystick.position.y;&&&
&&&&&&&&&&&
&&&&if(touchKey_x == -1){&&&
&&&&&&&setHeroState(HERO_LEFT);&
&&&&&&&&&&&&&
&&&&}else if(touchKey_x == 1){&&&
&&&&&&&setHeroState(HERO_RIGHT);&
&&&&&&&&&&&&&
&&&&if(touchKey_y == -1){&&&
&&&&&&&&setHeroState(HERO_DOWN);&
&&&&}else if(touchKey_y == 1){&&&
&&&&&&&&setHeroState(HERO_UP);&&&&&&&&&&
&&&&if(touchKey_x == 0 && touchKey_y ==0){&
&&&&&&&&//松开摇杆后播放默认动画,&
&&&&&&&&//不穿参数为播放默认动画。&
&&&&&&&&animation.Play();&
&&&&&&&&&&&
&&&&public void setHeroState(int newState)&
&&&&&&&&&&&
&&&&&&&&//根据当前人物方向 与上一次备份方向计算出模型旋转的角度&
&&&&&&&&int rotateValue = (newState - state) * 90;&
&&&&&&&&Vector3 transformValue = new Vector3();&
&&&&&&&&&&&
&&&&&&&&//播放行走动画&
&&&&&&&&animation.Play(&walk&);&
&&&&&&&&&&&
&&&&&&&&//模型移动的位移的数值&
&&&&&&&&switch(newState){&
&&&&&&&&&&&&case HERO_UP:&
&&&&&&&&&&&&&&&&transformValue = Vector3.forward * Time.deltaT&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&case HERO_DOWN:&
&&&&&&&&&&&&&&&&transformValue = -Vector3.forward * Time.deltaT&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&case HERO_LEFT:&
&&&&&&&&&&&&&&&&transformValue = Vector3.left * Time.deltaT&
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&case HERO_RIGHT:&
&&&&&&&&&&&&&&&&transformValue = -Vector3.left * Time.deltaT&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&}&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&//模型旋转&
&&&&&&&&transform.Rotate(Vector3.up, rotateValue);&
&&&&&&&&&&&
&&&&&&&&//模型移动&
&&&&&&&&transform.Translate(transformValue, Space.World);&
&&&&&&&&&&&
&&&&&&&&backState =&
&&&&&&&&state = newS&
&&&&&&&&&&&
上一章介绍了javaScript脚本使用游戏摇杆的方法,本章MOMO告诉大家使用C#脚本来使用游戏摇杆,上面我用 Controller.cs& C#脚本来接收系统提供的Joystick.js是肯定无法使用的,须要修改成.cs文件,我在国外的一个网站上看到了一个老外帮我们已经修改了,那么我将他修改后的代码贴出来方便大家学习,有兴趣的朋友可以研究研究。
MPJoystick.cs
[代码]c#/cpp/oc代码:
using UnityE&&
&* File: MPJoystick.cs
&* Author: Chris Danielson of (monkeyprism.com)
// USED TO BE: Joystick.js taken from Penelope iPhone Tutorial
// Joystick creates a movable joystick (via GUITexture) that&
// handles touch input, taps, and phases. Dead zones can control
// where the joystick input gets picked up and can be normalized.
// Optionally, you can enable the touchPad property from the editor
// to treat this Joystick as a TouchPad. A TouchPad allows the finger
// to touch down at any point and it tracks the movement relatively&
// without moving the graphic
[RequireComponent(typeof(GUITexture))]&
public class MPJoystick : MonoBehaviour&
class Boundary {&
public Vector2 min = Vector2.&
public Vector2 max = Vector2.&
private static MPJoystick[]&& // A static collection of all joysticks&
private static bool enumeratedJoysticks =&
private static float tapTimeDelta = 0.3f;&&& // Time allowed between taps&
public bool touchP&
public Vector2 position = Vector2.&
public Rect touchZ&
public Vector2 deadZone = Vector2.& // Control when position is output&
public bool normalize = // Normalize output after the dead-zone?&
public int tapC&&&&&&
private int lastFingerId = -1;&& // Finger last used for this joystick&
private float tapTimeW&&&& // How much time there is left for a tap to occur&
private Vector2 fingerDownP&
//private float fingerDownT&
//private float firstDeltaTime = 0.5f;&
private GUIT&
private Rect defaultR&&& // Default position / extents of the joystick graphic&
private Boundary guiBoundary = new Boundary();&& // Boundary for joystick graphic&
private Vector2 guiTouchO& // Offset to apply to touch input&
private Vector2 guiC&& // Center of joystick&
void Start() {&
gui = (GUITexture)GetComponent(typeof(GUITexture));&
defaultRect = gui.pixelI&
defaultRect.x += transform.position.x * Screen.// + gui.pixelInset.x; // -& Screen.width * 0.5;&
&&&&&&&&defaultRect.y += transform.position.y * Screen.// - Screen.height * 0.5;&
transform.position = Vector3.&
if (touchPad) {&
// If a texture has been assigned, then use the rect ferom the gui as our touchZone&
if ( gui.texture )&
touchZone = defaultR&
guiTouchOffset.x = defaultRect.width * 0.5f;&
guiTouchOffset.y = defaultRect.height * 0.5f;&
// Cache the center of the GUI, since it doesn't change&
guiCenter.x = defaultRect.x + guiTouchOffset.x;&
guiCenter.y = defaultRect.y + guiTouchOffset.y;&
// Let's build the GUI boundary, so we can clamp joystick movement&
guiBoundary.min.x = defaultRect.x - guiTouchOffset.x;&
guiBoundary.max.x = defaultRect.x + guiTouchOffset.x;&
guiBoundary.min.y = defaultRect.y - guiTouchOffset.y;&
guiBoundary.max.y = defaultRect.y + guiTouchOffset.y;&
public Vector2 getGUICenter() {&
return guiC&
void Disable() {&
gameObject.active =&
//enumeratedJoysticks =&
private void ResetJoystick() {&
gui.pixelInset = defaultR&
lastFingerId = -1;&
position = Vector2.&
fingerDownPos = Vector2.&
private bool IsFingerDown() {&
return (lastFingerId != -1);&
public void LatchedFinger(int fingerId) {&
// If another joystick has latched this finger, then we must release it&
if ( lastFingerId == fingerId )&
ResetJoystick();&
void Update() {&
if (!enumeratedJoysticks) {&
// Collect all joysticks in the game, so we can relay finger latching messages&
joysticks = (MPJoystick[])FindObjectsOfType(typeof(MPJoystick));&
enumeratedJoysticks =&
int count = Input.touchC&
if ( tapTimeWindow & 0 )&
tapTimeWindow -= Time.deltaT&
tapCount = 0;&
if ( count == 0 )&
ResetJoystick();&
for(int i = 0; i & i++) {&
Touch touch = Input.GetTouch(i);&
Vector2 guiTouchPos = touch.position - guiTouchO&
bool shouldLatchFinger =&
if (touchPad) {&
if (touchZone.Contains(touch.position))&
shouldLatchFinger =&
else if (gui.HitTest(touch.position)) {&
shouldLatchFinger =&
// Latch the finger if this is a new touch&
if (shouldLatchFinger && (lastFingerId == -1 || lastFingerId != touch.fingerId )) {&
if (touchPad) {&
//gui.color.a = 0.15;&
lastFingerId = touch.fingerId;&
//fingerDownPos = touch.&
//fingerDownTime = Time.&
lastFingerId = touch.fingerId;&
// Accumulate taps if it is within the time window&
if ( tapTimeWindow & 0 )&
tapCount++;&
tapCount = 1;&
tapTimeWindow = tapTimeD&
// Tell other joysticks we've latched this finger&
//for (& j : Joystick in joysticks )&
foreach (MPJoystick j in joysticks) {&
if (j != this)&&
j.LatchedFinger( touch.fingerId );&
if ( lastFingerId == touch.fingerId ) {&
// Override the tap count with what the iPhone SDK reports if it is greater&
// This is a workaround, since the iPhone SDK does not currently track taps&
// for multiple touches&
if ( touch.tapCount & tapCount )&
tapCount = touch.tapC&
if ( touchPad ) {&
// For a touchpad, let's just set the position directly based on distance from initial touchdown&
position.x = Mathf.Clamp( ( touch.position.x - fingerDownPos.x ) / ( touchZone.width / 2 ), -1, 1 );&
position.y = Mathf.Clamp( ( touch.position.y - fingerDownPos.y ) / ( touchZone.height / 2 ), -1, 1 );&
// Change the location of the joystick graphic to match where the touch is&
Rect r = gui.pixelI&
r.x =& Mathf.Clamp( guiTouchPos.x, guiBoundary.min.x, guiBoundary.max.x );&
r.y =& Mathf.Clamp( guiTouchPos.y, guiBoundary.min.y, guiBoundary.max.y );&
gui.pixelInset =&
if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled)&
ResetJoystick();&
if (!touchPad) {&
// Get a value between -1 and 1 based on the joystick graphic location&
position.x = ( gui.pixelInset.x + guiTouchOffset.x - guiCenter.x ) / guiTouchOffset.x;&
position.y = ( gui.pixelInset.y + guiTouchOffset.y - guiCenter.y ) / guiTouchOffset.y;&
// Adjust for dead zone&
var absoluteX = Mathf.Abs( position.x );&
var absoluteY = Mathf.Abs( position.y );&
if (absoluteX & deadZone.x) {&
// Report the joystick as being at the center if it is within the dead zone&
position.x = 0;&
else if (normalize) {&
// Rescale the output after taking the dead zone into account&
position.x = Mathf.Sign( position.x ) * ( absoluteX - deadZone.x ) / ( 1 - deadZone.x );&
if (absoluteY & deadZone.y) {&
// Report the joystick as being at the center if it is within the dead zone&
position.y = 0;&
else if (normalize) {&
// Rescale the output after taking the dead zone into account&
position.y = Mathf.Sign( position.y ) * ( absoluteY - deadZone.y ) / ( 1 - deadZone.y );&
导出 build and run& 看看在iPhone 上的效果,通过触摸游戏摇杆可以控制人物的上,下,左,右 ,左上,右上,左下,右下 8个方向的移动啦,不错吧,哇咔咔~~
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条热点头条热点
24H热文一周话题本月最赞
讲师:112193人学习过
讲师:218576人学习过
讲师:145737人学习过
精选博文论坛热帖下载排行
本书是关于Acegi、CAS的权威教程,是Java/Java EE安全性开发者的必备参考书。无论是Java EE安全性编程模型的背景和基础知识,还是Acegi、CA...
订阅51CTO邮刊

我要回帖

更多关于 物体检测模型 的文章

 

随机推荐