Unity 2D 旋转AI敌人看玩家
Unity 2D rotate the AI enemy to look at player
我正在制作一个左右两侧的 2D 游戏,因此玩家只能向左或向右移动或跳跃。我做了一个人工智能作为敌人。人工智能工作正常。他可以去找玩家杀他
问题是当玩家去杀他时敌人不能旋转或面对玩家。我想让 AI 看着玩家。当玩家在敌人的左侧时,敌人应该向左旋转以注视玩家。我搜索了很多网站,但没有得到任何正确的解决方案。这是我的敌人脚本:
public class enemy : MonoBehaviour
{
public float speed;
private Animator animvar;
private Transform target;
public GameObject effect;
public float distance;
private bool movingRight = true;
public Transform groundedDetection;
public float moveInput;
public bool facingRight = true;
void Start()
{
animvar = GetComponent<Animator>();
target = GameObject.FindGameObjectWithTag("Player").transform;
}
// Update is called once per frame
void Update()
{
if (Vector3.Distance(target.position, transform.position) < 20)
{
transform.position = Vector2.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
}
else
{
transform.Translate(Vector2.right * speed * Time.deltaTime);
}
RaycastHit2D groundInfo = Physics2D.Raycast(groundedDetection.position, Vector2.down, distance);
}
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag.Equals("danger"))
{
Instantiate(effect, transform.position, Quaternion.identity);
Destroy(gameObject);
}
if (col.gameObject.tag.Equals("Player"))
{
Instantiate(effect, transform.position, Quaternion.identity);
Destroy(gameObject);
}
}
}
游戏为2D,左,右,使用Unity3D跳跃。
你需要一个函数来翻转你的精灵,你可以通过改变变换的比例来实现,并保留一个布尔值来检查它面向的位置
bool facingRight;
,所以像这样
void Flip(){
Vector3 scale = transform.localScale;
scale.x *= -1;
transform.localScale = scale;
facingRight = !facingRight;
}
并在你的Update
中检查它是否需要翻转
if (Vector3.Distance(target.position,transform.position)<20)
{
transform.position=Vector2.MoveTowards(transform.position, target.position,speed*Time.deltaTime);
if(target.position.x > transform.position.x && !facingRight) //if the target is to the right of enemy and the enemy is not facing right
Flip();
if(target.position.x < transform.position.x && facingRight)
Flip();
}
很简单,只要获取玩家的x位置并与敌人的x位置进行比较,然后相应地翻转敌人精灵
这是我的 Enemy 脚本中的 Update() 方法。这处理了敌人的移动和改变精灵面对的方向:
if (moveRight )
{
transform.Translate(2 * Time.deltaTime * moveSpeed, 0, 0);
transform.localScale = new Vector2(6, 6); //6,6 is just a size that suits my sprite
}
else if (!moveRight)
{
transform.Translate(-2 * Time.deltaTime * moveSpeed, 0, 0);
transform.localScale = new Vector2(-6, 6);
}
这是我的敌人 Attack() 方法,我将玩家 X 位置与敌人 X 位置进行比较。如果玩家 X 较少(在敌人的左侧),我将敌人精灵翻转为负
if (transform.position.x > Player.position.x)
{
transform.localScale = new Vector2(-6, 6);
}
else if (transform.position.x < Player.position.x)
{
transform.localScale = new Vector2(6, 6);
}
我正在制作一个左右两侧的 2D 游戏,因此玩家只能向左或向右移动或跳跃。我做了一个人工智能作为敌人。人工智能工作正常。他可以去找玩家杀他
问题是当玩家去杀他时敌人不能旋转或面对玩家。我想让 AI 看着玩家。当玩家在敌人的左侧时,敌人应该向左旋转以注视玩家。我搜索了很多网站,但没有得到任何正确的解决方案。这是我的敌人脚本:
public class enemy : MonoBehaviour
{
public float speed;
private Animator animvar;
private Transform target;
public GameObject effect;
public float distance;
private bool movingRight = true;
public Transform groundedDetection;
public float moveInput;
public bool facingRight = true;
void Start()
{
animvar = GetComponent<Animator>();
target = GameObject.FindGameObjectWithTag("Player").transform;
}
// Update is called once per frame
void Update()
{
if (Vector3.Distance(target.position, transform.position) < 20)
{
transform.position = Vector2.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
}
else
{
transform.Translate(Vector2.right * speed * Time.deltaTime);
}
RaycastHit2D groundInfo = Physics2D.Raycast(groundedDetection.position, Vector2.down, distance);
}
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag.Equals("danger"))
{
Instantiate(effect, transform.position, Quaternion.identity);
Destroy(gameObject);
}
if (col.gameObject.tag.Equals("Player"))
{
Instantiate(effect, transform.position, Quaternion.identity);
Destroy(gameObject);
}
}
}
游戏为2D,左,右,使用Unity3D跳跃。
你需要一个函数来翻转你的精灵,你可以通过改变变换的比例来实现,并保留一个布尔值来检查它面向的位置
bool facingRight;
,所以像这样
void Flip(){
Vector3 scale = transform.localScale;
scale.x *= -1;
transform.localScale = scale;
facingRight = !facingRight;
}
并在你的Update
中检查它是否需要翻转
if (Vector3.Distance(target.position,transform.position)<20)
{
transform.position=Vector2.MoveTowards(transform.position, target.position,speed*Time.deltaTime);
if(target.position.x > transform.position.x && !facingRight) //if the target is to the right of enemy and the enemy is not facing right
Flip();
if(target.position.x < transform.position.x && facingRight)
Flip();
}
很简单,只要获取玩家的x位置并与敌人的x位置进行比较,然后相应地翻转敌人精灵
这是我的 Enemy 脚本中的 Update() 方法。这处理了敌人的移动和改变精灵面对的方向:
if (moveRight )
{
transform.Translate(2 * Time.deltaTime * moveSpeed, 0, 0);
transform.localScale = new Vector2(6, 6); //6,6 is just a size that suits my sprite
}
else if (!moveRight)
{
transform.Translate(-2 * Time.deltaTime * moveSpeed, 0, 0);
transform.localScale = new Vector2(-6, 6);
}
这是我的敌人 Attack() 方法,我将玩家 X 位置与敌人 X 位置进行比较。如果玩家 X 较少(在敌人的左侧),我将敌人精灵翻转为负
if (transform.position.x > Player.position.x)
{
transform.localScale = new Vector2(-6, 6);
}
else if (transform.position.x < Player.position.x)
{
transform.localScale = new Vector2(6, 6);
}