zoukankan      html  css  js  c++  java
  • [Unity3D]Unity3D游戏开发MatchTarget的作用攀登效果实现

            大家好,我是秦培,欢迎关注我的博客。我的博客地址blog.csdn.net/qinyuanpei

    今天我们来一起学习在Unity3D中怎样实现角色攀爬效果。

        在RPG游戏中,某些游戏场景经常须要玩家沿着墙壁或者梯子攀爬到高处,比如《仙剑奇侠传三》的九龙坡场景中,玩家须要沿着梯子爬到高处才干收集场景中的物品。


    相同在《古剑奇谭一》中的翻云寨,玩家则须要爬到顶层才干开启游戏里的机关。


    那么今天我们就来利用Mecanim动画系统中的MatchTarget来实现角色攀爬效果。

    在正式開始今天的内容前,首先让我们来了解下MatchTarget的详细概念。MatchTarger即匹配目标,是Animator类中的一个方法,该方法能够实如今运行动画的过程中使角色身体的某个部位与指定位置进行匹配。比方我们在攀爬的过程中,手、脚及身体应该是和墙壁接触的,那么这时我们就能够考虑使用这种方法,该方法定义例如以下:

    void MatchTarget (Vector3 matchPosition, Quaternion matchRotation, AvatarTarget targetBodyPart, MatchTargetWeightMask weightMask,
     float startNormalizedTime,float targetNormalizedTime)

    能够看出,在该方法中。我们指定了匹配的位置、角度、身体的详细部分、权重、匹配開始及匹配结束的时间。由此。我们就能够開始今天的内容了,首先我们来创建一个简单的场景:


    在这个场景中,我们希望角色能够沿着墙壁爬到墙上。那么详细怎么做呢?首先我们在场景中创建一个空的游戏体,将其命名为RightHandTarget,它将作为角色在攀爬时右手的一个匹配点。我们将其拖放到合适的位置。然后将其拖放到墙模型下。使其成为它的一个子物体。如图所看到的:


        好了,这样我们完毕了场景部分的搭建和准备工作。接下来我们来制作角色的动画模型,新建一个Animator Controller,命名为JumpGrab。双击打开Animator窗体,这里我们仅仅拖入两个动画Idle'JumpUp。这里我们新建两个float类型的參数MatchStartMatchEndBool类型的參数Jump,触发JumpUp动画的条件是JumpTrue。如图


    当中JumpUp是一个完整的攀爬墙壁的动画,在这个动画中,角色首先会伸出右手进行攀爬,因此我们能够将其右手与我们在场景中定义好的RightHandTarget进行匹配,从而保证角色在攀爬的过程中总是紧紧贴着墙壁。

    好了,如今让我们来编写脚本来将动画模型和角色关联起来:

    using UnityEngine;
    using System.Collections;
    
    public class TargetMatching : MonoBehaviour
    {
    	//动画组件
    	private Animator animator;
    	//右手着力点
    	public Transform RightHand;
    	//是否完毕跳跃
    	bool hasJumped = false;
    
    	AnimatorStateInfo mState;
    
    	void Start () 
    	{
    		//获取动画组件
    		animator = GetComponent<Animator>();
    	}
    
    	void Update () 
    	{
    
    		if (animator)
    		{
    			//获取动画状态
    			 mState = animator.GetCurrentAnimatorStateInfo(0);
    
    			if (Input.GetButton("Fire1")) animator.SetBool("Jump", true);
    			if (mState.IsName("Base Layer.JumpUp") || mState.IsName("Base Layer.FullJump")) 
    			{
    				animator.SetBool("Jump", false);
    				//调用MatchTarget方法				
    				animator.MatchTarget(RightHand.position, RightHand.rotation, AvatarTarget.RightHand, new MatchTargetWeightMask(new Vector3(1, 1, 1), 0), animator.GetFloat("MatchStart"), animator.GetFloat("MatchEnd"));
    				hasJumped = true;
    			}
    		}
    	
    	}
    }
    

       好了。以下我们来看终于的效果吧!


       好了,这就是今天的内容了,希望大家能够喜欢!


     

    每日箴言:不管发生什么都欣然接受。一切都是礼物。

    我们给予,我们接受。——艾丽丝·门罗




    喜欢我的博客请记住我的名字:秦元培,我博客地址是blog.csdn.net/qinyuanpei。
    转载请注明出处。本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/38275323


    版权声明:本文博客原创文章。博客,未经同意,不得转载。转载请注明作者和出处。谢谢。

  • 相关阅读:
    洛谷 P1194 飞扬的小鸟 题解
    洛谷 P1197 星球大战 题解
    洛谷 P1879 玉米田Corn Fields 题解
    洛谷 P2796 Facer的程序 题解
    洛谷 P2398 GCD SUM 题解
    洛谷 P2051 中国象棋 题解
    洛谷 P1472 奶牛家谱 Cow Pedigrees 题解
    洛谷 P1004 方格取数 题解
    洛谷 P2331 最大子矩阵 题解
    洛谷 P1073 最优贸易 题解
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4756459.html
Copyright © 2011-2022 走看看