if(Input.GetKey(KeyCode.W))
时间: 2024-04-17 18:29:47 浏览: 10
这是一个检测玩家是否按下W键的条件语句。在Unity游戏开发中,Input类提供了一系列用于获取输入的方法和属性。其中,GetKey方法用于检测某个键是否在当前帧被按下。KeyCode枚举类型用于表示不同的键,W键的KeyCode值为KeyCode.W。因此,这个条件语句判断如果玩家在当前帧按下了W键,则执行相应的代码逻辑。你可以根据这个条件语句来编写与W键输入相关的游戏逻辑。
相关问题
if(Input.GetKey(KeyCode.W)) { transform.position += new Vector3(0, 0.03f, 0); } else if(Input.GetKey(KeyCode.S)) { transform.position -= new Vector3(0, 0.03f, 0); }
这段代码是一个基于玩家输入的移动逻辑。根据玩家按下的键不同,物体的位置会相应地进行上下移动。
如果玩家按下了W键,就会执行if语句块中的代码,其中transform.position表示物体的当前位置,通过+=运算符将物体的位置向上移动一个固定的偏移量(在这里是(0, 0.03f, 0)),即将物体在Y轴上向上移动0.03个单位。
如果玩家按下了S键,就会执行else if语句块中的代码,其中transform.position表示物体的当前位置,通过-=运算符将物体的位置向下移动一个固定的偏移量(在这里是(0, 0.03f, 0)),即将物体在Y轴上向下移动0.03个单位。
这段代码可以用于控制物体在垂直方向上的移动,根据玩家输入的不同按键来决定是向上移动还是向下移动。
public void Move() { int stt = sun; scoreText.text = stt.ToString(); if (Input.GetKey(KeyCode.W)) { direction = 0; this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[2]; this.gameObject.transform.Translate(Vector3.up * speed * Time.deltaTime); } else if (Input.GetKey(KeyCode.S)) { this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[0]; direction = 2; this.gameObject.transform.Translate(Vector3.down * speed * Time.deltaTime); } else if (Input.GetKey(KeyCode.D)) { direction = 3; this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[1]; this.gameObject.transform.Translate(Vector3.right * speed * Time.deltaTime); } else if (Input.GetKey(KeyCode.A)) { direction = 1; this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[3]; this.gameObject.transform.Translate(Vector3.left * speed * Time.deltaTime); } // 播放脚步声 if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) { if (!audioSource.isPlaying) { audioSource.clip = footstepSound; audioSource.loop = true; audioSource.Play(); } } else { audioSource.Stop(); } // 攻击 if (Input.GetMouseButtonDown(0)) { // 处理鼠标左键点击事件 GameObject ins = Instantiate(bulletPrefab); Vector2 clickPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); ins.GetComponent<Blogs>().clickPosition = clickPosition; if (direction == 0) { ins.transform.position = new Vector3(this.gameObject.transform.position.x, this.gameObject.transform.position.y + 0.15f); } else if (direction == 2) { ins.transform.position = new Vector3(this.gameObject.transform.position.x, this.gameObject.transform.position.y - 0.15f); } else if (direction == 3) { ins.transform.position = new Vector3(this.gameObject.transform.position.x + 0.15f, this.gameObject.transform.position.y); } else if (direction == 1) { ins.transform.position = new Vector3(this.gameObject.transform.position.x - 0.15f, this.gameObject.transform.position.y); } } }public void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.tag == "GoldCoin") { Destroy(collision.gameObject); sun = sun + 1; if (!audioSource.isPlaying) { audioSource.clip = shique; audioSource.loop = true; audioSource.Play(); } } else { audioSource.Stop(); } //判断是否遭受攻击 if (collision.gameObject.tag == "zhi") { Destroy(collision.gameObject); hp = hp - 1; } // 检测碰撞物体的标签 if (collision.gameObject.tag == "zhi2") { // 忽略该碰撞 Physics2D.IgnoreCollision(collision.collider, GetComponent<Collider2D>()); } }优化代码
1. 将变量和函数命名规范化,遵循驼峰式命名法。
2. 将常量和不变的数值提取出来,定义为常量或静态变量。
3. 合理利用 Unity 引擎提供的功能,如使用 GetComponent 获取组件、使用 ScreenToWorldPoint 将屏幕坐标转换为世界坐标等。
4. 使用 switch 语句代替 if-else 语句,可以提高代码可读性和效率。
5. 在需要处理多个碰撞标签时,可以使用 switch-case 语句代替多个 if-else 语句。
修改后的代码如下:
```C#
public class PlayerController : MonoBehaviour {
private const float Speed = 5f; // 移动速度
private const int MaxHp = 5; // 最大生命值
private const float BulletOffset = 0.15f; // 子弹偏移量
[SerializeField] private AudioClip footstepSound; // 脚步声音效
[SerializeField] private AudioClip shique; // 收集金币音效
[SerializeField] private GameObject bulletPrefab; // 子弹预制体
[SerializeField] private Sprite[] prota; // 精灵数组
[SerializeField] private Text scoreText; // 分数文本
private AudioSource audioSource; // 音频源
private int hp = MaxHp; // 当前生命值
private int score; // 得分
private int direction; // 移动方向
private void Start() {
audioSource = GetComponent<AudioSource>();
}
private void Update() {
Move();
Attack();
}
private void Move() {
scoreText.text = score.ToString();
Vector3 movement = Vector3.zero;
if (Input.GetKey(KeyCode.W)) {
direction = 0;
GetComponent<SpriteRenderer>().sprite = prota[2];
movement = Vector3.up;
} else if (Input.GetKey(KeyCode.S)) {
direction = 2;
GetComponent<SpriteRenderer>().sprite = prota[0];
movement = Vector3.down;
} else if (Input.GetKey(KeyCode.D)) {
direction = 3;
GetComponent<SpriteRenderer>().sprite = prota[1];
movement = Vector3.right;
} else if (Input.GetKey(KeyCode.A)) {
direction = 1;
GetComponent<SpriteRenderer>().sprite = prota[3];
movement = Vector3.left;
}
transform.Translate(movement * Speed * Time.deltaTime);
PlayFootstepSound(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D));
}
private void PlayFootstepSound(bool isMoving) {
if (isMoving && !audioSource.isPlaying) {
audioSource.clip = footstepSound;
audioSource.loop = true;
audioSource.Play();
} else if (!isMoving) {
audioSource.Stop();
}
}
private void Attack() {
if (Input.GetMouseButtonDown(0)) {
GameObject bullet = Instantiate(bulletPrefab);
Vector2 clickPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
bullet.GetComponent<Bullet>().SetDirection(direction);
bullet.transform.position = transform.position + BulletOffset * (Vector3)clickPosition.normalized;
}
}
private void OnTriggerEnter2D(Collider2D other) {
switch (other.tag) {
case "GoldCoin":
CollectCoin(other.gameObject);
break;
case "zhi":
TakeDamage(1);
break;
}
}
private void OnTriggerStay2D(Collider2D other) {
if (other.tag == "zhi2") {
Physics2D.IgnoreCollision(other, GetComponent<Collider2D>());
}
}
private void CollectCoin(GameObject coin) {
Destroy(coin);
score++;
audioSource.PlayOneShot(shique);
}
private void TakeDamage(int amount) {
hp -= amount;
if (hp <= 0) {
Die();
}
}
private void Die() {
Destroy(gameObject);
// TODO: 处理玩家死亡逻辑
}
}
```