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