注册 登录
编程论坛 C语言论坛

求教,这个自定义的C#类是如何工作的?

bxe 发布于 2019-07-22 21:31, 2174 次点击
程序代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 动画行为类,提供有关动画的行为
/// </summary>
public class AnimationAction

{
    //附加在敌人上的动画组件引用
    private Animation anim;

    /// <summary>
   
/// 创建动画行为类
   
/// </summary>
   
/// <param name="anim"></param>
    public AnimationAction(Animation anim)
    {
        this.anim = anim;
    }

    /// <summary>
   
/// 播放动画
   
/// </summary>
   
/// <param name="animName"></param>
    public void Play(string animName)
    {
        anim.CrossFade(animName);
        //.........
    }

    /// <summary>
   
/// 判断指定动画是否在播放
   
/// </summary>
   
/// <param name="animName"></param>
   
/// <returns></returns>
     public bool IsPlaying(string animName)
    {
        return anim.IsPlaying(animName);
    }

}
这是一个用于Unity 3d 获取动画组件的辅助类,视频里讲,把模型挂在空物体下,脚本挂在空物体上,用一个脚本,获取模型上的动画,而这个类是用于辅助的,但我搞不懂它是怎么起作用的。
1,首先 AnimationAction()这个在做什么?
首先它应该是个构造函数(没有get,没有返回值),他需要被一个对象调用(点它),但是它在做什么?
this.anim = anim 是获取了一个Animation类型的引用,存储到自身的字段?
2,之后的 Play()用字段存储的对象,调用继承的CrossFade()方法,来播放动画
所以这个方法为的是省去每次书写么?

视频中的使用方法:
EnemyAnimation anim;
anim.action.Play(anim.runAnimName);

附action的定义入
程序代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 敌人动画,定义需要播放的动画片段名称
/// </summary>
public class EnemyAnimation : MonoBehaviour
{
    public string runAnimName;

    public string attackAnimName;

    /// <summary>
   
/// 闲置
   
/// </summary>
    public string idleAnimName;



    public string deathAnimName;

    public AnimationAction action;

    private void Awake()
    {
        action = new AnimationAction(GetComponentInChildren<Animation>());
    }


}




附2:对上面进行调用的脚本
程序代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 敌人AI
/// </summary>
[RequireComponent(typeof(EnemyAnimation))]
[RequireComponent(typeof(EnemyMotor))]
[RequireComponent(typeof(EnemyStatusInfo))]

public class EnemyAI : MonoBehaviour
{
    //定义敌人状态
    public enum State
    {
        //攻击
        Attack ,
        //寻路
        PathFinding

    }
    /// <summary>
   
/// 敌人当前状态
   
/// </summary>
    private State currentState = State.PathFinding;
    private EnemyAnimation anim;
    private EnemyMotor motor;

    private void Start()
    {
        anim = GetComponent<EnemyAnimation>();
        motor = GetComponent<EnemyMotor>();

    }

    private float atkTimer;
    /// <summary>
   
/// 攻击间隔
   
/// </summary>
    public float atkInterval = 3;
    private void Update()
    {
        //判断
        switch (currentState)
        {
            case State.PathFinding:
                PathFinding();
                break;

            case State.Attack:
                Attack();
                break;
        }

        //寻路,攻击
    }

    private void PathFinding()
    {
        anim.action.Play(anim.runAnimName);
        //执行寻路 调用motor类中寻路方法,播放跑步动画
        
//如果寻路结束,修改状态为攻击

        if (motor.Pathfinding() == false) currentState = State.Attack;
    }

    private void Attack()
    {
        if (anim.action.IsPlaying(anim.attackAnimName) == false)
            anim.action.Play(anim.idleAnimName);
            //如果动画没有播放
            if (atkTimer <= Time.time)
            {
                //进行攻击 播放攻击动画
                anim.action.Play(anim.attackAnimName);
                atkTimer = Time.time + atkInterval;
            }
    }

}



[此贴子已经被作者于2019-7-22 22:03编辑过]

2 回复
#2
S酱紫2019-07-23 22:44
这个帖子是不是面向C#论坛的?(本人是萌新,不知道说什么好,求放过)
#3
S酱紫2019-07-23 22:46
看到C#,果然灵敏想到unity3D,很不简单哩,但这些建议对着视频教程看看,得要自学。
(咱学校莫得unity3D学,最多只能靠自学咯,编程真是涉及到的东西太多啦)
1