Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换在当前上下文中不存在_C#_Unity3d - Fatal编程技术网

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

C# 转换在当前上下文中不存在,c#,unity3d,C#,Unity3d,我发现很难理解为什么我的转换是错误的。有人能帮我解决这个问题吗。我正试图为我的敌人制造一个FSM,所以它要么是为了玩家,要么是为了食物。但是当我尝试测试它时,我得到了一个编译器错误 using UnityEngine; using System.Collections; public class Enemy : MovingObject { public int playerDamage; private Animator animator; private Tra

我发现很难理解为什么我的转换是错误的。有人能帮我解决这个问题吗。我正试图为我的敌人制造一个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;
 }
MovingObject脚本:

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;
}
使用UnityEngine;
使用系统集合;
公共抽象类移动对象:MonoBehavior
{
公共浮动时间=0.1f;
公共层屏蔽层;
私人boxCollider R2D boxCollider;
私有刚体2d rb2D;
私人浮动时间;
//用于初始化
受保护的虚拟void开始()
{
boxCollider=GetComponent();
rb2D=GetComponent();
反向移动时间=1f/移动时间;
}
受保护的布尔移动(int-xDir、int-yDir、out-RaycastHit2D命中)
{
矢量2开始=变换位置;
Vector2结束=开始+新Vector2(xDir,yDir);
boxCollider.enabled=false;
hit=Physics2D.Linecast(开始、结束、blockingLayer);
boxCollider.enabled=true;
if(hit.transform==null)
{
开始例行程序(平滑移动(结束));
返回true;
}
返回false;
}
受保护的IEnumerator平滑移动(矢量3结束)
{
float sqrRemainingDistance=(transform.position-end).sqrMagnitude;
while(sqrRemainingDistance>float.Epsilon)
{
Vector3 newPosition=Vector3.MoveToward(rb2D.position,end,inverseMoveTime*Time.deltaTime);
rb2D.移动位置(新位置);
SqrMainingDistance=(transform.position-end).sqrMagnitude;
收益返回空;
}
}
受保护的虚拟void尝试移动(int-xDir,int-yDir),其中T:Component
{
雷卡斯特2D命中;
bool canMove=移动(xDir、yDir、out hit);
if(hit.transform==null)
返回;
T hitComponent=hit.transform.GetComponent();
如果(!canMove&&hitComponent!=null)
OnCantMove(hitComponent);
}
受保护的抽象void OnCantMove(T组件),其中T:component;
}

它找不到
transform.position
,因为transform是未在组件下声明的变量<代码>单一行为从
行为
驱动,而
行为
组件
派生。要访问
transform
变量,脚本必须从其中一个派生。虽然
monobhavior
是脚本应该从中派生出来的

在代码中,您的
敌人
脚本已经从
移动对象
脚本派生,该脚本派生自
单行为
,因此您可以访问
转换
变量,但存在问题。在敌方脚本中的
ai敌方()
函数末尾有一个额外的
}
aidefey()
函数末尾的额外
}
关闭或标记
敌方
脚本的结尾,从而使
转换
变量对您不可用删除
aifriend()
函数末尾的额外
}
,您的问题应该得到解决

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

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;
    }
}
公共类敌人:移动对象
{
公众伤害;
私人动画师;
私有转换目标;
私人布尔斯基普莫夫;
私有变换播放器;
公共音频剪辑enemyAttack1;
公共音频剪辑enemyAttack2;
受保护的覆盖无效开始()
{
GameManager.instance.AddEnemeyToList(this);
animator=GetComponent();
target=GameObject.FindGameObjectWithTag(“食物”).transform;
base.Start();
爱的敌人();
Player=GameObject.FindWithTag(“Player”).transform;
}
受保护的覆盖无效尝试移动(int-xDir、int-yDir)
{
if(skipMove)
{
skipMove=false;
返回;
}
base.AttemptMove(xDir,yDir);
skipMove=true;
}
公敌
{
int-xDir=0;
int-yDir=0;
if(Mathf.Abs(target.position.x-transform.position.x)transform.position.y?1:-1;
其他的
xDir=target.position.x>transform.position.x?1:-1;
尝试移动(xDir、yDir);
}
受保护的覆盖无效OnCantMove(T组件)
{
玩家hitPlayer=作为玩家的组件;
击球员。失败者食物(玩家伤害);
设置触发器(“enemyAttack”);
SoundManager.instance.RandomizeSfx(enemyAttack1,enemyAttack2);
}
私有无效OnTiggerEnter2D(碰撞R2D其他)
{
如果(other.tag==“食物”)
{
other.gameObject.SetActive(false);
}
else if(other.tag==“Soda”)
{
other.gameObject.SetActive(false);
}
}
无效
{
int State=0;
如果(状态==0)
{
变换。看(玩家);
状态++;
}
如果(状态==1)
变换。注视(目标);
Debug.Log(“状态1”);
状态++;
如果(状态==2)
{
Debug.Log(“状态2”);
}
}
公共转换FindClosetFood()
{
float minDistance=float.PositiveInfinity;
transformclosetfood=null;
GameObject[]foods=GameObject.FindGameObjectsWithTag(“Food”);
for(int i=0;i
这只是一个打字错误<代码>“变换”。位置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; } }