c# - 当前上下文中不存在转换

标签 c# unity3d

我发现很难弄清楚为什么我的转换是错误的。谁能帮我解决这个问题。我正在尝试为我的敌人制作一个 FSM,所以它要么是为了玩家,要么是为了食物。但是当我尝试对其进行测试时,我遇到了编译器错误。

using UnityEngine;
using System.Collections;

public class Enemy : MovingObject 
{
    public int playerDamage;

    private Animator animator;
    private Transform target;
    private bool skipMove;
    private Transform Player;
    public AudioClip enemyAttack1;
    public AudioClip enemyAttack2;

    protected override void Start () 
    {
        GameManager.instance.AddEnemeyToList(this);
        animator = GetComponent<Animator> ();
        target = GameObject.FindGameObjectWithTag ("Food").transform;
        base.Start ();

        AIEnemy();
        Player = GameObject.FindWithTag("Player").transform;
    }

    protected override void AttemptMove<T> (int xDir, int yDir) 
    {
        if (skipMove) 
        {
            skipMove = false;
            return;
        }

        base.AttemptMove <T> (xDir, yDir);

        skipMove = true;
    }

    public void MoveEnemy() 
    {
        int xDir = 0;
        int yDir = 0;

        if (Mathf.Abs (target.position.x - transform.position.x) < float.Epsilon)
            yDir = target.position.y > transform.position.y ? 1 : -1;
        else
            xDir = target.position.x > transform.position.x ? 1 : -1;

        AttemptMove<Player> (xDir, yDir);
    }

    protected override void OnCantMove <T> (T component) 
    {
        Player hitPlayer = component as Player;
        hitPlayer.LoseFood (playerDamage);
        animator.SetTrigger("enemyAttack");
        SoundManager.instance.RandomizeSfx (enemyAttack1, enemyAttack2);
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Food")
        {
            other.gameObject.SetActive(false);
        }
        else if (other.tag == "Soda")
        {
            other.gameObject.SetActive(false);
        }
    }

    void AIEnemy()
    {
        int State = 0;

        if (State == 0)
        {
            transform.LookAt(Player);
            State++;
        }

        if (State == 1)
            transform.LookAt(target);

        Debug.Log("State 1");
        State++;

        if (State == 2)
        {
            Debug.Log("State 2");
        }

    }

}

public Transform FindClosetFood()
{
    float minDistance = float.PositiveInfinity;
    Transform closetFood = null;
    GameObject[] foods = GameObject.FindGameObjectsWithTag("Food");
    for(int i = 0; i<foods.Length; i++)
    {
        float distance = Vector2.Distance(transform.position, foods[i].transform.position);
        if (distance < minDistance)
        {
            minDistance = distance;
            closetFood = foods[i].transform;
        }
    }
    return closetFood;
 }

我添加了一个私有(private)的 Transform Player。所以我的敌人知道要看什么,但我仍然没有在控制台中得到任何东西。我试着在开始时调用它。但是现在我遇到了这个编译器错误。

错误出现在这一行

float distance = Vector2.Distance("transform".position, foods[i].transform.position);

移动对象脚本:

using UnityEngine;
using System.Collections;

public abstract class MovingObject : MonoBehaviour 
{
    public float moveTime = 0.1f;
    public LayerMask blockingLayer;

    private BoxCollider2D boxCollider;
    private Rigidbody2D rb2D;
    private float inverseMoveTime;

    // Use this for initialization
    protected virtual void Start () 
    {
        boxCollider = GetComponent<BoxCollider2D> ();
        rb2D = GetComponent<Rigidbody2D> ();
        inverseMoveTime = 1f / moveTime;
    }

    protected bool Move (int xDir, int yDir, out RaycastHit2D hit) 
    {
        Vector2 start = transform.position;
        Vector2 end = start + new Vector2 (xDir, yDir);

        boxCollider.enabled = false;
        hit = Physics2D.Linecast (start, end, blockingLayer);
        boxCollider.enabled = true;

        if (hit.transform == null) 
        {
            StartCoroutine(SmoothMovement (end));
            return true;
        }

        return false;
    }

    protected IEnumerator SmoothMovement (Vector3 end) 
    {
        float sqrRemainingDistance = (transform.position - end).sqrMagnitude;
        while (sqrRemainingDistance > float.Epsilon) 
        {
            Vector3 newPosition = Vector3.MoveTowards (rb2D.position, end, inverseMoveTime * Time.deltaTime);
            rb2D.MovePosition(newPosition);
            sqrRemainingDistance = (transform.position - end).sqrMagnitude;
            yield return null;
        }
    }

    protected virtual void AttemptMove <T> (int xDir, int yDir) where T : Component
    {
        RaycastHit2D hit;
        bool canMove = Move (xDir, yDir, out hit);

        if (hit.transform == null)
            return;

        T hitComponent = hit.transform.GetComponent<T> ();

        if(!canMove && hitComponent != null)
            OnCantMove (hitComponent);
    }

    protected abstract void OnCantMove <T> (T component) where T : Component;
}

最佳答案

找不到 transform.position 因为 transform 是 Component 下未声明的变量。 MonoBehaviourBehaviour 驱动,BehaviourComponent 派生。要访问 transform 变量,您的脚本必须派生自其中之一。虽然 MonoBehaviour 是脚本应该派生的内容。

在代码中,您的Enemy 脚本已经派生自MovingObject 脚本,该脚本派生自MonoBehaviour,因此您应该可以访问 transform 变量,但有一个问题。 在 Enemy 脚本中 AINemy() 函数的末尾有一个额外的 }那个额外的 }AINemy() 函数的末尾关闭或标记 Enemy 脚本的末尾,从而使 transform 变量对您不可用。 删除 AINemy() 函数末尾的额外},您的问题应该得到解决。

如果找不到,请使用下面的新Enemy 脚本:

public class Enemy : MovingObject
{

    public int playerDamage;

    private Animator animator;
    private Transform target;
    private bool skipMove;
    private Transform Player;
    public AudioClip enemyAttack1;
    public AudioClip enemyAttack2;

    protected override void Start()
    {
        GameManager.instance.AddEnemeyToList(this);
        animator = GetComponent<Animator>();
        target = GameObject.FindGameObjectWithTag("Food").transform;
        base.Start();

        AIEnemy();
        Player = GameObject.FindWithTag("Player").transform;


    }

    protected override void AttemptMove<T>(int xDir, int yDir)
    {
        if (skipMove)
        {
            skipMove = false;
            return;
        }

        base.AttemptMove<T>(xDir, yDir);

        skipMove = true;
    }

    public void MoveEnemy()
    {
        int xDir = 0;
        int yDir = 0;

        if (Mathf.Abs(target.position.x - transform.position.x) < float.Epsilon)
            yDir = target.position.y > transform.position.y ? 1 : -1;
        else
            xDir = target.position.x > transform.position.x ? 1 : -1;

        AttemptMove<Player>(xDir, yDir);
    }

    protected override void OnCantMove<T>(T component)
    {
        Player hitPlayer = component as Player;
        hitPlayer.LoseFood(playerDamage);
        animator.SetTrigger("enemyAttack");
        SoundManager.instance.RandomizeSfx(enemyAttack1, enemyAttack2);
    }

    private void OnTriggerEnter2D(Collider2D other)
    {

        if (other.tag == "Food")
        {

            other.gameObject.SetActive(false);
        }
        else if (other.tag == "Soda")
        {

            other.gameObject.SetActive(false);
        }


    }

    void AIEnemy()
    {
        int State = 0;

        if (State == 0)
        {
            transform.LookAt(Player);
            State++;
        }
        if (State == 1)

            transform.LookAt(target);
        Debug.Log("State 1");
        State++;
        if (State == 2)
        {
            Debug.Log("State 2");
        }

    }


    public Transform FindClosetFood()
    {
        float minDistance = float.PositiveInfinity;
        Transform closetFood = null;
        GameObject[] foods = GameObject.FindGameObjectsWithTag("Food");
        for (int i = 0; i < foods.Length; i++)
        {
            float distance = Vector2.Distance(transform.position, foods[i].transform.position);
            if (distance < minDistance)
            {
                minDistance = distance;
                closetFood = foods[i].transform;
            }
        }
        return closetFood;
    }
}

关于c# - 当前上下文中不存在转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53363474/

相关文章:

c# - F# 轻量级脚本环境

c# - 从不同线程中的类更新文本框

unity3d - 如何加载同名的 Assets ,但放置在assetbundle的不同文件夹中?

android - 如何解决移动设备上 UDP 的高延迟问题

c# - 如何统一将游戏对象设置为精确长度

c# - HttpListener 构造函数在系统启动时花费的时间太长

c# - 如何用javascript按下按钮

c# - 使用 from...to 范围声明 int 变量

c# - 团结/骑士: order of multiplication operations is inefficient?

c# - 统一正则表达式